home *** CD-ROM | disk | FTP | other *** search
/ AppleScript - The Beta Release / AppleScript - The Beta Release.iso / Development Tools / Sample Applications / MenuScripter 1.0d4.1 / MenuScripter Source / MSAppleEvents.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-11-24  |  175.0 KB  |  6,493 lines  |  [TEXT/MPS ]

  1. /* 
  2.     MSAppleEvents.c 
  3.   
  4.     Version 1.0d4
  5.     
  6.     Copyright © Apple Computer UK Ltd. 1992
  7.     
  8.     All rights reserved
  9.     
  10.     Produced by : UK Developer Technical Support    UK.DTS
  11.     
  12.     The AppleEvent handling routines for the MenuScripter example program
  13.     
  14.     This file includes :
  15.     
  16.         a) the code for the AppleEvent initialisation 
  17.         b) the routines for all the Edition Manager events
  18.         c) the Apple® Event Object Support
  19.  
  20. */
  21.  
  22. /*
  23.     Changes for 1.0d2: 
  24.     
  25.         10-Aug-92 : NH : Fixed Quit save no - AEInteractWithUser called now
  26.                                          Added IssueQuitCommand.
  27.                                          Install cLine from typeMyText accessor
  28.                                          
  29.     Changes for 1.0d3:
  30.     
  31.         21-Aug-92 : NH : Fix hadPlain for offstyles in GetTextStyles
  32.                          Dispose of objTokenDesc in HandleGetData
  33.                                          Use result of BuildStyledTextDesc
  34.                                          nil myDirObj at start of DoGetDataSize
  35.                                          Dispose of selfAddr in IssueCloseCommand
  36.                                          
  37.         27-Aug-92 : NH : Added pBestType and pClass to all classes
  38.          1-Sep-92 : NH : Added factoring of window selection.
  39.                          Added OKToModifySelection and inhibition of 
  40.                                          changes to subscribers.
  41.                                          Fixed pIndex property of window
  42.                                          Changed MakeWindowObj to create formAbsolutePosition, not formName for
  43.                                          better recording.
  44.                                          Ignore all AEDisposeDesc results, return true errors
  45.                                          
  46.     Changes for 1.0d4:
  47.  
  48.         14-Nov-92    : NH : Changed pUserSelection to pSelection
  49. */
  50.  
  51.  
  52. #include <AppleEvents.h>
  53. #include <Sysequ.h>
  54. #include <Menus.h>
  55. #include <PLStringFuncs.h>
  56. #include <Scrap.h>
  57. #include <TextEdit.h>
  58. #include <AEObjects.h>
  59. #include <AEPackObject.h>
  60. #include <AERegistry.h>
  61. #include "MSGlobals.h"
  62. #include "MSUtils.h"
  63. #include "MSAEUtils.h"
  64. #include "MSWindow.h"
  65. #include "MSFile.h"
  66. #include "MSScript.h"
  67. #include "MSAppleEvents.h"
  68.  
  69. /* these should come from the registry */
  70.         
  71. #define         kAEStartedRecording    'rec1'
  72. #define         kAEStoppedRecording         'rec0'
  73. #define         kAEDontExecute                  0x00002000
  74. #define         errCantWriteSubscriber 10000
  75.  
  76. #define         pContents                 'pcnt' // Borrowed from Quill
  77. #define     cSpot             'cspt'
  78.  
  79. /*
  80.     Text Properties
  81. */
  82.         
  83. #define         pStringWidth            'pwid'
  84.         
  85. /*
  86.     Window Properties - See the Registry for Details
  87. */
  88.         
  89. #define     pPosition                'ppos'
  90. #define         pPageSetup                'PSET' /* One of ours - Not in registry */
  91. #define         pShowBorders            'PBOR' /* Another of ours */
  92. #define     pSelection        'sele' /* changed from pUserSelection */
  93.                 
  94. #define         typeTPrint                'TPNT' /* A raw TPrint record - also one of ours */
  95.  
  96. /*
  97.     Menu properties of our own devising
  98. */
  99.  
  100. #define     pActiveItem       'PACT'
  101.  
  102. /*
  103.     Error Codes
  104. */
  105.         
  106. #define         kAEGenericErr    -1799
  107.  
  108. static long   gBigBrother;
  109. static char  *gTypingBuffer;
  110. static short  gCharsInBuffer;
  111. static AEDesc gTypingTargetObject;
  112.  
  113. /*-----------------------------------------------------------------------*/
  114. /**----------                         APPLE EVENT HANDLING                     ---------------**/
  115. /*-----------------------------------------------------------------------*/
  116.  
  117. pascal OSErr GetTHPrintFromDescriptor(const AEDesc *sourceDesc, THPrint *result)
  118.   {
  119.       OSErr   myErr;
  120.         OSErr   ignoreErr;
  121.         Size    ptSize;
  122.         AEDesc  resultDesc;
  123.         
  124.         myErr = AECoerceDesc(sourceDesc,typeTPrint,&resultDesc);
  125.         
  126.         *result = nil;
  127.         
  128.         if (myErr==noErr) 
  129.             {
  130.                 *result = (THPrint)NewHandle(sizeof(TPrint));
  131.                 
  132.                 PrOpen();
  133.                 PrintDefault(*result);
  134.                 
  135.                 HLock((Handle)*result);
  136.     
  137.                 GetRawDataFromDescriptor(&resultDesc,
  138.                                                                  (Ptr)**result,
  139.                                                                  sizeof(TPrint),
  140.                                                                  &ptSize);
  141.                                                                  
  142.                 HUnlock((Handle)*result);
  143.                 
  144.                 if ((ptSize<sizeof(TPrint)) || (PrValidate(*result)))
  145.                     {
  146.                         myErr = errAECoercionFail;
  147.                         DisposHandle((Handle)*result);
  148.                         *result = nil;
  149.                     }
  150.                 
  151.                 PrClose();
  152.             }
  153.         
  154.         if (resultDesc.dataHandle) 
  155.             ignoreErr = AEDisposeDesc(&resultDesc);
  156.             
  157.         return(myErr);
  158.     } /*GetTHPrintFromDescriptor*/
  159.  
  160. /*******************************************************************************/
  161. /*
  162.     Object Accessors - Utility Routines
  163. */
  164.  
  165. #pragma segment ObjectAccessors
  166.  
  167. pascal WindowPtr WindowNameToWindowPtr(StringPtr nameStr)
  168. /* 
  169.     Returns the WindowPtr of the window with title nameStr
  170.     or nil if there is no matching window.
  171. */
  172.     { 
  173.         WindowPtr theWindow;
  174.         Str255    windTitle;
  175.             
  176.         theWindow = (WindowPtr)*((Handle)WindowList);
  177.         /* 
  178.             iterate through windows - we use WindowList 'cos we could
  179.             have made the window invisible and  we lose it - so we
  180.             can't set it back to visible!!
  181.         */
  182.         while (theWindow)
  183.             {
  184.                 GetWTitle(theWindow, windTitle);
  185.                 if (EqualString(windTitle,
  186.                                 nameStr,
  187.                                                 false,
  188.                                                 true))     /* ignore case, don't ignore diacriticals */
  189.                     return(theWindow);
  190.               theWindow = (WindowPtr)((WindowPeek)theWindow)->nextWindow;
  191.             }
  192.         return(theWindow);
  193.     }    /* WindowNameToWindowPtr */
  194.  
  195. pascal WindowPtr GetWindowPtrOfNthWindow(short index)
  196. /* returns a ptr to the window with the given index
  197.   (front window is 1, behind that is 2, etc.).  if
  198.   there's no window with that index (inc. no windows
  199.   at all), returns nil.
  200. */
  201.   {
  202.       WindowPtr theWindow;
  203.         
  204.         theWindow = (WindowPtr)*((Handle)WindowList);
  205.     
  206.         /* iterate through windows */
  207.         
  208.         while (theWindow)
  209.             {
  210.                 index --;
  211.                 if (index <= 0) 
  212.                     return(theWindow);
  213.                     
  214.               theWindow = (WindowPtr)((WindowPeek)theWindow)->nextWindow;
  215.             }
  216.         return(nil);
  217.     }    /* GetWindowPtrOfNthWindow */
  218.     
  219. pascal short CountWindows(void)
  220.     {
  221.         WindowPtr theWindow;
  222.         short     index;
  223.                 
  224.         index = 0;
  225.         theWindow = (WindowPtr)*((Handle)WindowList);
  226.     
  227.         /* iterate through windows */
  228.         
  229.         while (theWindow)
  230.             {
  231.                 index++;                    
  232.               theWindow = (WindowPtr)((WindowPeek)theWindow)->nextWindow;
  233.             }
  234.         
  235.         return(index);
  236.         
  237.     } /*CountWindows*/
  238.     
  239. pascal short ItemForNamedFont(Str255 theName)
  240.     {
  241.       Str255  itemName;
  242.         short   limit;
  243.     
  244.         limit = CountMItems(myMenus[fontM]);
  245.         while (limit>0)
  246.             {
  247.                 GetItem(myMenus[fontM],limit, itemName);
  248.                 if (IUEqualString(theName, itemName)==0) 
  249.                     return(limit);
  250.                 else
  251.                     limit--;
  252.             }
  253.         return(0);
  254.     } /*ItemForNamedFont*/
  255.  
  256. /**-----------------------------------------------------------------------
  257.         Name:             DoOpenApp
  258.         Purpose:        Called on startup, creates a new document.
  259.     -----------------------------------------------------------------------**/
  260.  
  261. #pragma segment Main
  262.  
  263. pascal OSErr DoOpenApp(const AppleEvent *message,const AppleEvent *reply,long refcon)
  264.   {
  265. #pragma unused (reply,refcon, message)
  266.     
  267.       DPtr ourDoc;
  268.     
  269.         /*just create a new document*/
  270.         ourDoc = NewDocument(false);
  271.         
  272.         if (ourDoc)
  273.             {
  274.                 ShowWindow(ourDoc->theWindow);
  275.                 return(noErr);
  276.             }
  277.         else
  278.             return(-108);
  279.     }
  280.  
  281. /**-----------------------------------------------------------------------
  282.         Name:             DoOpenDocument
  283.         Purpose:        Open all the documents passed in the Open AppleEvent.
  284. -----------------------------------------------------------------------**/
  285.  
  286. #pragma segment Main
  287.  
  288. pascal OSErr DoOpenDocument(const AppleEvent *message, const AppleEvent *reply, long refcon)            
  289.   {
  290. #pragma unused (reply, refcon)
  291.  
  292.         long        index;
  293.         long        itemsInList;
  294.         AEKeyword   keywd;
  295.         OSErr       err;
  296.         OSErr       ignoreErr;
  297.         AEDescList  docList;
  298.         long        actSize;
  299.         DescType    typeCode;
  300.         FSSpec      theFSSpec;
  301.         
  302.         /*open the specified documents*/
  303.         
  304.         docList.dataHandle = nil;
  305.         
  306.         err = AEGetParamDesc(message, keyDirectObject, typeAEList, &docList);
  307.         
  308.         if (err==noErr)
  309.             err = AECountItems( &docList, &itemsInList) ;
  310.         else
  311.           itemsInList = 0;
  312.             
  313.         for (index = 1; index <= itemsInList; index++)
  314.             if (err==noErr)
  315.                 {
  316.                     err = AEGetNthPtr( &docList, index, typeFSS, &keywd, &typeCode,
  317.                                                          (Ptr)&theFSSpec, sizeof(theFSSpec), &actSize ) ;
  318.                     if (err==noErr)
  319.                       err = OpenOld(theFSSpec);
  320.                 }
  321.     
  322.       if (docList.dataHandle)
  323.             ignoreErr = AEDisposeDesc(&docList);
  324.             
  325.         return(err);
  326.     }
  327.  
  328. /**-----------------------------------------------------------------------
  329.         Name:             MyQuit
  330.         Purpose:        Quit event received- exit the program.
  331.     -----------------------------------------------------------------------**/
  332.  
  333. #pragma segment Main
  334.  
  335. pascal OSErr MyQuit(const AppleEvent *message,const AppleEvent *reply,long refcon)            
  336.     {
  337. #pragma unused (reply,refcon)
  338.     
  339.         DescType saveOpt;
  340.         OSErr    tempErr;
  341.         OSErr    myErr;
  342.         DescType returnedType;
  343.         long     actSize;
  344.         
  345.         saveOpt = kAEAsk; /* the default */
  346.         tempErr = AEGetParamPtr(message,
  347.                                                         keyAESaveOptions,
  348.                                                         typeEnumerated,
  349.                                                         &returnedType,
  350.                                                         (Ptr)&saveOpt,
  351.                                                         sizeof(saveOpt),
  352.                                                         &actSize);
  353.         
  354.         if (saveOpt != kAENo)
  355.             myErr = AEInteractWithUser(kAEDefaultTimeout, nil, nil);
  356.  
  357.       if (myErr == noErr)
  358.             DoQuit(saveOpt);
  359.         
  360.         return(myErr);
  361.     }
  362.  
  363. /**-----------------------------------------------------------------------
  364.         Name:             DoAppleEvent
  365.         Purpose:        Process and despatch the AppleEvent
  366.     -----------------------------------------------------------------------**/
  367.  
  368. #pragma segment Main
  369.  
  370. pascal void DoAppleEvent(EventRecord theEvent)
  371.   {
  372.       OSErr err;
  373.         
  374.       /*should check for your own event message types here - if you have any*/
  375.  
  376.         err = AEProcessAppleEvent(&theEvent);
  377.     }
  378.  
  379. /**-----------------------------------------------------------------------
  380.         Name:             MakeSelfAddress
  381.         Purpose:        Builds an AEAddressDesc for the current process
  382.     -----------------------------------------------------------------------**/
  383.     
  384. pascal OSErr MakeSelfAddress(AEAddressDesc *selfAddress)
  385.   {
  386.       ProcessSerialNumber procSerNum;
  387.     
  388.         procSerNum.highLongOfPSN = 0;
  389.         procSerNum.lowLongOfPSN  = kCurrentProcess;
  390.         
  391.         return(AECreateDesc(typeProcessSerialNumber,
  392.                                                 (Ptr)&procSerNum,
  393.                                               sizeof(procSerNum),
  394.                                                 selfAddress));
  395.         
  396.     } /* MakeSelfAddress */
  397.  
  398. /**--------------------------------------------------------------------
  399.     Name : SendAESetObjProp
  400.     Function : Creates a property object from an object,
  401.                          a property type and its data and sends it to
  402.                          the requested address, and cleans up zapping params too
  403.     --------------------------------------------------------------------**/
  404.  
  405. pascal OSErr SendAESetObjProp(AEDesc        *theObj,
  406.                                                             DescType      theProp,
  407.                                                             AEDesc        *theData,
  408.                                                             AEAddressDesc *toWhom)
  409.                                                      
  410.     {
  411.        AEDesc     propObjSpec;
  412.          AppleEvent myAppleEvent;
  413.          AppleEvent defReply;
  414.          OSErr      myErr;
  415.          OSErr      ignoreErr;
  416.          AEDesc     theProperty;
  417.             
  418.         /* create an object spec that represents the property of the given object */
  419.         
  420.         myErr = AECreateDesc(typeType,
  421.                                                  (Ptr)&theProp,
  422.                                                  sizeof(theProp),
  423.                                                  &theProperty);
  424.         if (myErr==noErr)
  425.             myErr = CreateObjSpecifier(cProperty,
  426.                                                                  theObj,
  427.                                                                  formPropertyID,
  428.                                                                  &theProperty,
  429.                                                                  true,
  430.                                                                  &propObjSpec);    
  431.             
  432.         /* create event */
  433.         
  434.         if (myErr==noErr)
  435.             myErr = AECreateAppleEvent(kAECoreSuite,
  436.                                                                  kAESetData,
  437.                                                                  toWhom,
  438.                                                                  0,
  439.                                                                  0,
  440.                                                                  &myAppleEvent);
  441.             
  442.         /* add prop obj spec to the event */
  443.         
  444.         if (myErr==noErr)
  445.             myErr = AEPutParamDesc(&myAppleEvent, keyDirectObject, &propObjSpec);
  446.         
  447.         /* add prop data to the event */
  448.         
  449.         if (myErr==noErr)
  450.             myErr = AEPutParamDesc(&myAppleEvent,keyAEData, theData);
  451.         
  452.         /* send event */
  453.         
  454.         if (myErr==noErr)
  455.             myErr = AESend(&myAppleEvent,
  456.                                          &defReply,
  457.                                          kAENoReply+kAEAlwaysInteract,
  458.                                          kAENormalPriority,
  459.                                          kAEDefaultTimeout,
  460.                                          nil,
  461.                                          nil);
  462.         
  463.         if (myAppleEvent.dataHandle)
  464.             ignoreErr = AEDisposeDesc(&myAppleEvent);
  465.             
  466.         if (&propObjSpec.dataHandle)
  467.           ignoreErr = AEDisposeDesc(&propObjSpec);
  468.         
  469.         if (theData->dataHandle)
  470.             ignoreErr = AEDisposeDesc(theData);
  471.         
  472.         if (toWhom->dataHandle)
  473.             ignoreErr = AEDisposeDesc(toWhom);
  474.         
  475.         return(myErr);
  476.         
  477.     }    /* SendAESetObjProp */
  478.  
  479. /*----------------------------------------------------------------------------------------------*/
  480. /*
  481.     Private AEObject definitions
  482. */
  483. #pragma segment AECommandHandlers
  484.  
  485. #define typeMyAppl       'BAPP' /* sig of my private token type for the app     - appToken   */
  486. #define typeMyWndw             'BWIN'    /* sig of my private token type for windows     - windowToken   */
  487. #define typeMyText           'BTXT'    /* sig of my private token type for text        - textToken     */
  488. #define typeMyTextProp   'BPRP'    /* sig of my private token type for text properties    - textPropToken */
  489. #define typeMyWindowProp 'WPRP'    /* sig of my private token type for window properties  - windowPropToken */
  490. #define typeMyApplProp   'APRP'    /* sig of my private token type for appl properties    - applPropToken */
  491. #define typeMyMenu       'MTKN' /* sig of my private token type for menus       - menuToken  */
  492. #define typeMyMenuItem   'ITKN' /* sig of my private token type for menus       - menuItemToken  */
  493. #define typeMyMenuProp   'MPRP' /* sig of my private token type for menu properties - menuPropToken  */
  494. #define typeMyItemProp   'IPRP' /* sig of my private token type for menu item properties  - menuItemPropToken  */
  495.     
  496. /* These are entirely private to our app - used only when resolving the object specifier */
  497.     
  498. typedef    ProcessSerialNumber appToken;
  499.     
  500. struct applPropToken{
  501.     appToken tokenApplToken;
  502.     DescType tokenApplProperty;
  503. };
  504.  
  505. typedef struct applPropToken applPropToken;
  506.                                         
  507. typedef    WindowPtr WindowToken;
  508.     
  509. struct windowPropToken{
  510.         WindowToken tokenWindowToken;
  511.         DescType    tokenProperty;
  512.     };
  513.     
  514. typedef struct windowPropToken windowPropToken;
  515.     
  516. struct TextToken{
  517.         WindowPtr tokenWindow;
  518.         short     tokenOffset;
  519.         short     tokenLength;
  520.     };
  521.                     
  522. typedef struct TextToken TextToken;
  523.  
  524. struct textPropToken{
  525.         TextToken propertyTextToken;
  526.         DescType  propertyProperty;
  527.     };
  528.                 
  529. typedef struct textPropToken textPropToken;
  530.  
  531. /* Tokens related to menus */
  532.  
  533. struct MenuToken {
  534.     MenuHandle theTokenMenu;
  535.     short      theTokenID;
  536. };
  537.  
  538. typedef struct MenuToken MenuToken;
  539.  
  540. struct MenuItemToken {
  541.     MenuToken  theMenuToken;
  542.     short      theTokenItem;
  543. };
  544.  
  545. typedef struct MenuItemToken MenuItemToken;
  546.  
  547. struct MenuPropToken {
  548.     MenuToken  theMenuToken;
  549.     DescType   theMenuProp;
  550. };
  551.  
  552. typedef struct MenuPropToken MenuPropToken;
  553.  
  554. struct MenuItemPropToken {
  555.     MenuItemToken  theItemToken;
  556.     DescType       theItemProp;
  557. };
  558.  
  559. typedef struct MenuItemPropToken MenuItemPropToken;
  560.  
  561. /*
  562.     Name: GotRequiredParams
  563.     Function: Checks all parameters defined as 'required' have been read
  564. */                            
  565. pascal OSErr GotRequiredParams(const AppleEvent *theAppleEvent)
  566.     {
  567.       OSErr    myErr;
  568.         DescType returnedType;
  569.         Size     actSize;
  570.         
  571.         /* look for the keyMissedKeywordAttr, just to see if it's there */
  572.         
  573.         myErr = AEGetAttributePtr(theAppleEvent,
  574.                                                             keyMissedKeywordAttr,
  575.                                                             typeWildCard,
  576.                                                             &returnedType,
  577.                                                             nil,
  578.                                                             0,
  579.                                                             &actSize);
  580.         
  581.         if (myErr == errAEDescNotFound) 
  582.             return(noErr);            /* attribute not there means we got all req params */
  583.         else 
  584.             if (myErr == noErr)  
  585.                 return(errAEParamMissed);        /* attribute there means missed at least one */
  586.             else 
  587.                 return(myErr);        /* some unexpected arror in looking for the attribute */
  588.     }    /* GotReqiredParams */
  589.  
  590. /**--------------------------------------------------------------------
  591.     Name : SetSelectionOfAppleEventDirectObject
  592.     Function : Resolves the Direct Object into a text token and
  593.                          sets the selection of the specified document to that
  594.                          specified in the direct object.
  595.                          Returns the doc and TEHandle chosen.
  596.     --------------------------------------------------------------------**/
  597.  
  598. pascal OSErr SetSelectionOfAppleEventDirectObject(const AppleEvent *theAppleEvent,
  599.                                                                                                DPtr             *theDocument,
  600.                                                                                                 TEHandle         *theHTE)
  601.     {
  602.         OSErr     myErr;
  603.         DescType  returnedType;
  604.         long      actSize;
  605.         TextToken myTextToken;
  606.         OSErr     paramErr;
  607.         WindowPtr fWin;
  608.                     
  609.         paramErr = AEGetParamPtr( theAppleEvent,
  610.                                                             keyDirectObject,
  611.                                                             typeMyText,
  612.                                                             &returnedType,
  613.                                                       (Ptr)&myTextToken,
  614.                                                             sizeof(myTextToken),
  615.                                                             &actSize);
  616.               
  617.         myErr = GotRequiredParams(theAppleEvent);
  618.         
  619.         /* now let's work on the direct object, if any */
  620.         
  621.         if (paramErr == errAEDescNotFound) 
  622.             {
  623.                 /* no direct object; check we have a window */
  624.                 
  625.                 fWin = FrontWindow();
  626.  
  627.                 if (fWin == nil) 
  628.                     return(-1700); /* Generic Err */
  629.                     
  630.                 *theDocument = DPtrFromWindowPtr(fWin);
  631.                 *theHTE      = (**theDocument).theText;
  632.             }
  633.         
  634.         if (paramErr == noErr) 
  635.             {
  636.                 /* got a text token */
  637.                 
  638.                 *theDocument = DPtrFromWindowPtr(myTextToken.tokenWindow);
  639.                 *theHTE      = (**theDocument).theText;
  640.                 
  641.                 TESetSelect(myTextToken.tokenOffset-1,
  642.                             myTextToken.tokenOffset+myTextToken.tokenLength-1,
  643.                                         *theHTE);
  644.                 
  645.             }
  646.             
  647.         if ((paramErr!=noErr) &&
  648.             (paramErr!=errAEDescNotFound))
  649.              {
  650.                  *theDocument = DPtrFromWindowPtr(FrontWindow());
  651.                  *theHTE      = (**theDocument).theText;
  652.              }
  653.              
  654.      return(myErr);
  655.      
  656.     } /* SetSelectionOfAppleEventDirectObject */
  657.     
  658. /**--------------------------------------------------------------------
  659.     Name             : SetSelectionOfAppleEventObject
  660.     Function     : Resolves the whatObject type of the AppleEvent into a text
  661.                              token and sets the selection to be that specified in the
  662.                              text token.
  663.                              Returns the doc and TEHandle chosen.
  664.     --------------------------------------------------------------------**/
  665.  
  666. pascal OSErr SetSelectionOfAppleEventObject(OSType            whatObject,
  667.                                                                                     const AppleEvent *theAppleEvent,
  668.                                                                                      DPtr             *theDocument,
  669.                                                                                     TEHandle         *theHTE)
  670.     {
  671.         DescType   returnedType;
  672.         long       actSize;
  673.         TextToken  myTextToken;
  674.         OSErr      paramErr;
  675.             
  676.         paramErr  = AEGetParamPtr(theAppleEvent,
  677.                                                             whatObject,
  678.                                                             typeMyText,
  679.                                                             &returnedType,
  680.                                                       (Ptr)&myTextToken,
  681.                                                             sizeof(myTextToken),
  682.                                                             &actSize);
  683.                                       
  684.         if (paramErr == noErr) 
  685.             {
  686.                 /* got a text token */
  687.                 
  688.                 *theDocument = DPtrFromWindowPtr(myTextToken.tokenWindow);
  689.                 *theHTE      = (**theDocument).theText;
  690.                 
  691.                 TESetSelect(myTextToken.tokenOffset-1,
  692.                             myTextToken.tokenOffset+myTextToken.tokenLength-1,
  693.                                         *theHTE);
  694.             }
  695.                              
  696.         return(paramErr);
  697.                  
  698.     } /* SetSelectionOfAppleEventObject */
  699.     
  700. /* -----------------------------------------------------------------------
  701.         Name:             AddErrorTextToReply
  702.         Purpose:        Adds the text to cannot modify subscriber
  703.      -----------------------------------------------------------------------**/
  704.      
  705. pascal void AddErrorTextToReply(const Str255 theText, AppleEvent *reply)
  706.     {
  707.         OSErr myErr;
  708.         
  709.         if (reply->descriptorType!=typeNull)
  710.             myErr = AEPutParamPtr(reply,
  711.                             keyErrorString,
  712.                             typeChar,
  713.                             (Ptr) &theText[1],
  714.                             theText[0]);
  715.     }
  716.     
  717. /* -----------------------------------------------------------------------
  718.         Name:             DoCutEdit
  719.         Purpose:        Performs a cut text operation on the current text selection
  720.      -----------------------------------------------------------------------**/
  721.     
  722. pascal OSErr DoCutEdit(const AppleEvent *theAppleEvent, AppleEvent *reply ,long refCon)
  723.     {
  724. #pragma unused (reply,refCon)
  725.     
  726.       OSErr    myErr;
  727.       TEHandle theHTE;
  728.         DPtr     theDocument;
  729.     
  730.         myErr = SetSelectionOfAppleEventDirectObject(theAppleEvent,&theDocument,&theHTE);
  731.         
  732.         if (myErr==noErr) 
  733.             {            
  734.                 myErr = (OSErr) ZeroScrap();
  735.                 
  736.                 if (OKToModifySelection(theDocument))
  737.                     {
  738.                         DoTECutSectionRecalc(theDocument);
  739.                         TECut(theHTE);
  740.                         
  741.                         RecalcChangedSectionBorders(theDocument);
  742.                         AdjustScrollbars(theDocument, false);
  743.                         DrawPageExtras(theDocument);
  744.                         theDocument->dirty = true;
  745.                     }
  746.                 else
  747.                     {
  748.                         myErr = errCantWriteSubscriber;
  749.                         AddErrorTextToReply("\pCannot write into subscriber", reply);
  750.                     }
  751.             }
  752.             
  753.         return(myErr);
  754.     } /* DoCutEdit */
  755.     
  756. /* -----------------------------------------------------------------------
  757.         Name:             DoCopyEdit
  758.         Purpose:        Performs a copy text operation on the text selection specified
  759.                                 by the appleEvent direct object (if any)
  760.      -----------------------------------------------------------------------**/
  761.     
  762. pascal OSErr DoCopyEdit(const AppleEvent *theAppleEvent,AppleEvent *reply, long refCon)
  763.     {
  764. #pragma unused (reply,refCon)
  765.     
  766.       OSErr    myErr;
  767.         TEHandle theHTE;
  768.         DPtr     theDocument;
  769.  
  770.         /*
  771.                 Here we extract the information about what to copy from the
  772.                 directObject - if any
  773.         */
  774.         
  775.         myErr = SetSelectionOfAppleEventDirectObject(theAppleEvent,&theDocument,&theHTE);
  776.         
  777.         if (myErr==noErr) 
  778.             {
  779.                 myErr = (OSErr) ZeroScrap();
  780.                 TECopy(theHTE);     
  781.             }
  782.             
  783.         if (myErr==noErr) 
  784.             {
  785.                 myErr = SetSelectionOfAppleEventObject(keyAEContainer, 
  786.                                                                                              theAppleEvent,
  787.                                                                                              &theDocument,
  788.                                                                                              &theHTE);
  789.                 if (myErr == noErr) 
  790.                     if (OKToModifySelection(theDocument))
  791.                         {
  792.                             DoTEPasteSectionRecalc(theDocument);
  793.                             
  794.                             TEStylPaste(theHTE);
  795.                             
  796.                             RecalcChangedSectionBorders(theDocument);
  797.                             AdjustScrollbars(theDocument, false);
  798.                             DrawPageExtras(theDocument);
  799.                             
  800.                             theDocument->dirty = true;
  801.                         }
  802.                     else
  803.                         {
  804.                             myErr = errCantWriteSubscriber;
  805.                             AddErrorTextToReply("\pCannot write into subscriber", reply);
  806.                         }
  807.             }
  808.             
  809.         return(myErr);
  810.     } /* DoCopyEdit */
  811.     
  812. /* -----------------------------------------------------------------------
  813.         Name:             DoPasteEdit
  814.         Purpose:        Performs a paste text operation on the text selection specified
  815.                                 by the appleEvent direct object (if any)
  816.      -----------------------------------------------------------------------**/
  817.     
  818. pascal OSErr DoPasteEdit(const AppleEvent *theAppleEvent,AppleEvent *reply, long refCon)
  819.     {
  820. #pragma unused (reply,refCon)
  821.     
  822.       OSErr    myErr;
  823.         TEHandle theHTE;
  824.         DPtr     theDocument;
  825.  
  826.         myErr = SetSelectionOfAppleEventDirectObject(theAppleEvent, &theDocument, &theHTE);
  827.         
  828.         if (myErr==noErr) 
  829.             if (OKToModifySelection(theDocument))
  830.                 {
  831.                     DoTEPasteSectionRecalc(theDocument);
  832.                     
  833.                     TEStylPaste(theHTE);     
  834.                     
  835.                     RecalcChangedSectionBorders(theDocument);
  836.                     AdjustScrollbars(theDocument, false);
  837.                     DrawPageExtras(theDocument);
  838.     
  839.                     theDocument->dirty = true;
  840.                 }
  841.             else
  842.                 {
  843.                     myErr = errCantWriteSubscriber;
  844.                     AddErrorTextToReply("\pCannot write into subscriber", reply);
  845.                 }
  846.             
  847.         return(myErr);
  848.     } /* DoPasteEdit */
  849.     
  850. /* -----------------------------------------------------------------------
  851.         Name:             DoDeleteEdit
  852.         Purpose:        Performs a delete text operation on the selection specified
  853.                                 by the appleEvent direct object (if any)
  854.      -----------------------------------------------------------------------**/
  855.      
  856. pascal OSErr DoDeleteEdit(const AppleEvent *theAppleEvent,AppleEvent *reply, long refcon)
  857.     {
  858. #pragma unused (reply,refcon)
  859.     
  860.         OSErr     myErr;
  861.         TEHandle theHTE;
  862.         DPtr     theDocument;
  863.             
  864.         myErr = SetSelectionOfAppleEventDirectObject(theAppleEvent, &theDocument, &theHTE);
  865.         
  866.         if (myErr==noErr)
  867.             if (OKToModifySelection(theDocument))
  868.                 {
  869.                     DoTEDeleteSectionRecalc(theDocument);
  870.                             
  871.                     TEDelete(theHTE);
  872.                     
  873.                     RecalcChangedSectionBorders(theDocument);
  874.                     theDocument->dirty = true;
  875.                     AdjustScrollbars(theDocument, false);
  876.                     DrawPageExtras(theDocument);
  877.                 }
  878.             else
  879.                 {
  880.                     myErr = errCantWriteSubscriber;
  881.                     AddErrorTextToReply("\pCannot write into subscriber", reply);
  882.                 }
  883.                 
  884.         return(myErr);
  885.     } /*DoDeleteEdit*/
  886.     
  887. /* -----------------------------------------------------------------------
  888.         Name:             SetTheFontOfTheTokenText
  889.         Purpose:        Sets the font of the text specified by theTextToken to 
  890.                                 the font in name.
  891.      -----------------------------------------------------------------------**/
  892.      
  893. pascal OSErr SetTheFontOfTheTokenText(TextToken theTextToken, Str255 name)
  894.     {
  895.       DPtr      theDocument;
  896.         short     theNumber;
  897.         short     theItem;
  898.         GrafPtr   oldPort;
  899.         TextStyle newStyle;
  900.         OSErr     myErr;
  901.     
  902.         myErr = noErr;
  903.         GetPort(&oldPort);
  904.         
  905.         theDocument = DPtrFromWindowPtr(theTextToken.tokenWindow);
  906.                 
  907.         GetFNum(name, &theNumber);
  908.         
  909.         theItem = ItemForNamedFont(name); /* returns 0 if failed - i.e. SystemFont */
  910.         
  911.         if (gFontMItem)
  912.             CheckItem(myMenus[fontM], gFontMItem, false);
  913.         
  914.         gFontMItem = theItem;
  915.         CheckItem(myMenus[fontM], gFontMItem, true);
  916.         
  917.         theDocument->theFont = theNumber;
  918.         
  919.         TESetSelect(theTextToken.tokenOffset-1,
  920.                                 theTextToken.tokenOffset+theTextToken.tokenLength-1,
  921.                                 theDocument->theText);
  922.         
  923.         if (OKToModifySelection(theDocument))
  924.             {
  925.                 newStyle.tsFont = theNumber;
  926.                 TESetStyle(doFont, &newStyle, true, theDocument->theText); 
  927.                 
  928.                 AdjustScrollbars(theDocument, false);
  929.                 DrawPageExtras(theDocument);
  930.                 theDocument->dirty = true;
  931.             }
  932.         else
  933.             myErr = errCantWriteSubscriber;
  934.             
  935.         SetPort(oldPort);
  936.     
  937.         return(myErr);
  938.     } /* SetTheFontOfTheTokenText */
  939.     
  940. /* -----------------------------------------------------------------------
  941.         Name:             SetTheSizeOfTheTokenText
  942.         Purpose:        Sets the size of the text specified by theTextToken to 
  943.                                 the size in theSize.
  944.      -----------------------------------------------------------------------**/
  945.      
  946. pascal OSErr SetTheSizeOfTheTokenText(TextToken theTextToken, short theSize)
  947.     {
  948.         DPtr      theDocument;
  949.         GrafPtr   oldPort;
  950.         TextStyle newStyle;
  951.         OSErr     myErr;
  952.     
  953.         myErr = noErr;
  954.         GetPort(&oldPort);
  955.         
  956.         theDocument = DPtrFromWindowPtr(theTextToken.tokenWindow);
  957.                                 
  958.         theDocument->theSize = theSize;
  959.         
  960.         TESetSelect(theTextToken.tokenOffset-1,
  961.                                 theTextToken.tokenOffset+theTextToken.tokenLength-1,
  962.                                 theDocument->theText);
  963.         
  964.         if (OKToModifySelection(theDocument))
  965.             {
  966.                 newStyle.tsSize = theSize;
  967.                 TESetStyle(doSize, &newStyle, true, theDocument->theText); 
  968.                 
  969.                 AdjustScrollbars(theDocument, false);
  970.                 DrawPageExtras(theDocument);
  971.                 theDocument->dirty = true;
  972.             }
  973.         else
  974.             myErr = errCantWriteSubscriber;
  975.             
  976.         SetPort(oldPort);
  977.         return(myErr);
  978.     } /* SetTheSizeOfTheTokenText */
  979.     
  980. /* -----------------------------------------------------------------------
  981.         Name:             SetTheStyleOfTheTokenText
  982.         Purpose:        Sets the style of the text specified by theTextToken to 
  983.                                 the style in theStyle.
  984.      -----------------------------------------------------------------------**/
  985.      
  986. pascal OSErr SetTheStyleOfTheTokenText(const TextToken *theTextToken, Style onStyle, Style offStyle)
  987.     {
  988.       DPtr      theDocument;
  989.         GrafPtr   oldPort;
  990.         TextStyle newStyle;
  991.         short     mode;
  992.         Boolean   wasContinuous;
  993.         OSErr     myErr;
  994.     
  995.         myErr = noErr;
  996.         
  997.         GetPort(&oldPort);
  998.         
  999.         theDocument = DPtrFromWindowPtr(theTextToken->tokenWindow);
  1000.                                 
  1001.         theDocument->theStyle = onStyle;
  1002.         TESetSelect(theTextToken->tokenOffset-1,
  1003.                                 theTextToken->tokenOffset+theTextToken->tokenLength-1,
  1004.                                 theDocument->theText);
  1005.         
  1006.         if (!OKToModifySelection(theDocument))
  1007.             return(errCantWriteSubscriber);
  1008.  
  1009.         // Check to see if off styles are on for whole selection
  1010.         mode = doFace;
  1011.         
  1012.         wasContinuous = TEContinuousStyle(&mode, &newStyle, theDocument->theText);
  1013.         if ((newStyle.tsFace & offStyle) != offStyle) // not off styles are on for all
  1014.             {
  1015.               // switch on across board so that toggle off will clear all
  1016.             newStyle.tsFace  = offStyle - (newStyle.tsFace & offStyle);
  1017.                 TESetStyle(doFace+doToggle, &newStyle, false, theDocument->theText); 
  1018.             }
  1019.             
  1020.         newStyle.tsFace  = offStyle;
  1021.         TESetStyle(doFace+doToggle, &newStyle,(onStyle==0), theDocument->theText); // toggle all to off
  1022.         
  1023.         mode = doFace;
  1024.         if (onStyle)
  1025.             {
  1026.                 wasContinuous = TEContinuousStyle(&mode, &newStyle, theDocument->theText);
  1027.                 if ((newStyle.tsFace & onStyle) != onStyle) // are they on for only a few chars
  1028.                     { 
  1029.                         // Need to make all chars have these characteristics
  1030.                     
  1031.                         newStyle.tsFace = onStyle - (newStyle.tsFace & onStyle); // take out those continuous
  1032.                         TESetStyle(doFace+doToggle, &newStyle, true, theDocument->theText);
  1033.                     }
  1034.                 else
  1035.                     TESetStyle(0, &newStyle, true, theDocument->theText); // Just Draw it, no changes
  1036.             }
  1037.             
  1038.         AdjustScrollbars(theDocument, false);
  1039.         DrawPageExtras(theDocument);
  1040.         theDocument->dirty = true;
  1041.         
  1042.         SetPort(oldPort);
  1043.         
  1044.         return(myErr);
  1045.     } /* SetTheStyleOfTheTokenText */
  1046.  
  1047. /* -----------------------------------------------------------------------
  1048.         Name:             SetWindowProperty
  1049.         Purpose:        Sets the window property specified in theWindowPropToken to
  1050.                                 be that supplied in dataDesc.
  1051.      -----------------------------------------------------------------------**/
  1052.      
  1053. pascal OSErr SetWindowProperty(const AEDesc *theWPTokenDesc, const AEDesc *dataDesc)
  1054.     {
  1055.       Str255          theNewName;
  1056.         DPtr            theDocument;
  1057.         OSErr           err;
  1058.         OSErr           ignoreErr;
  1059.         Rect            thePosnRect;
  1060.         Boolean         theBoolean;
  1061.         TEHandle        theHTE;
  1062.         GrafPtr         oldPort;
  1063.         Point           thePosn;
  1064.         THPrint         theTHPrint;
  1065.         windowPropToken theWindowPropToken;
  1066.         AEDesc          newDesc;
  1067.         AEDesc          tokenDesc;
  1068.         Size            tokenSize;
  1069.         TextToken       myTextToken;
  1070.         short           hOffset;
  1071.         short           vOffset;
  1072.  
  1073.         err = AECoerceDesc(theWPTokenDesc, typeMyWindowProp, &newDesc);
  1074.         
  1075.         if (err)
  1076.             return(err);
  1077.  
  1078.         GetRawDataFromDescriptor(&newDesc,
  1079.                                                          (Ptr)&theWindowPropToken,
  1080.                                                          sizeof(theWindowPropToken),
  1081.                                                          &tokenSize);
  1082.         
  1083.         ignoreErr = AEDisposeDesc(&newDesc);
  1084.     
  1085.         GetPort(&oldPort);
  1086.         SetPort(theWindowPropToken.tokenWindowToken);
  1087.         
  1088.         theDocument = DPtrFromWindowPtr(theWindowPropToken.tokenWindowToken);
  1089.         
  1090.         switch (theWindowPropToken.tokenProperty) {
  1091.         
  1092.             case pName:
  1093.                             err = GetPStringFromDescriptor(dataDesc, (char *)theNewName);
  1094.                             if (err==noErr) 
  1095.                                 if (theNewName[0] == 0) 
  1096.                                     err = errAEWrongDataType;
  1097.                                 else
  1098.                                     {
  1099.                                         SetWTitle(theWindowPropToken.tokenWindowToken, theNewName);
  1100.                                         PLstrcpy(theDocument->theFileName, theNewName); /* Should we do this??? */
  1101.                                         theDocument->dirty = true;
  1102.                                     }
  1103.                             break;
  1104.             
  1105.             case pContents:
  1106.                             theHTE = theDocument->theText;
  1107.                             TESetSelect(0, 32000, theHTE);
  1108.                             
  1109.                             if (OKToModifySelection(theDocument))
  1110.                                 {
  1111.                                     DoTEDeleteSectionRecalc(theDocument);
  1112.                                     TEDelete(theHTE);
  1113.                                     err = GetStyledTextFromDescIntoTEHandle(dataDesc, theHTE);
  1114.                                     RecalcChangedSectionBorders(theDocument);
  1115.                                     theDocument->dirty = true;
  1116.                                 }
  1117.                             else
  1118.                                 err = errCantWriteSubscriber;
  1119.                             break;
  1120.                             
  1121.             case pBounds:
  1122.                             err = GetRectFromDescriptor(dataDesc, &thePosnRect);
  1123.                             /* the rectangle is for the structure region, and is in global coordinates */
  1124.                             /* MoveWindow and SizeWindow apply to the content region, so we have to massage a little */
  1125.             
  1126.                             thePosnRect.top    += (**((WindowPeek)theWindowPropToken.tokenWindowToken)->contRgn).rgnBBox.top -
  1127.                                                                         (**((WindowPeek)theWindowPropToken.tokenWindowToken)->strucRgn).rgnBBox.top;
  1128.                                                                         
  1129.                             thePosnRect.left   += (**((WindowPeek)theWindowPropToken.tokenWindowToken)->contRgn).rgnBBox.left -
  1130.                                                                         (**((WindowPeek)theWindowPropToken.tokenWindowToken)->strucRgn).rgnBBox.left;
  1131.                                                                         
  1132.                             thePosnRect.bottom += (**((WindowPeek)theWindowPropToken.tokenWindowToken)->contRgn).rgnBBox.bottom -
  1133.                                                                         (**((WindowPeek)theWindowPropToken.tokenWindowToken)->strucRgn).rgnBBox.bottom;
  1134.                                                                         
  1135.                             thePosnRect.right  += (**((WindowPeek)theWindowPropToken.tokenWindowToken)->contRgn).rgnBBox.right -
  1136.                                                                         (**((WindowPeek)theWindowPropToken.tokenWindowToken)->strucRgn).rgnBBox.right;
  1137.                             
  1138.                             if (EmptyRect(&thePosnRect)) 
  1139.                                 err = errAECorruptData;
  1140.                             else
  1141.                                 {
  1142.                                     MoveWindow(theWindowPropToken.tokenWindowToken,
  1143.                                                          thePosnRect.left,
  1144.                                                          thePosnRect.top,
  1145.                                                          false);
  1146.                                     SizeWindow(theWindowPropToken.tokenWindowToken,
  1147.                                                          thePosnRect.right- thePosnRect.left,
  1148.                                                          thePosnRect.bottom-thePosnRect.top,
  1149.                                                          true);
  1150.                                     ResizeWindow(theDocument);
  1151.                                 }
  1152.                             break;
  1153.  
  1154.             case pPosition:
  1155.                             err = GetPointFromDescriptor(dataDesc, &thePosn);
  1156.                             /* the point is for the structure region, and is in global coordinates */
  1157.                             /* MoveWindow applies to the content region, so we have to massage a little */
  1158.                             
  1159.                             hOffset = (**((WindowPeek)theWindowPropToken.tokenWindowToken)->contRgn).rgnBBox.left -
  1160.                                                 (**((WindowPeek)theWindowPropToken.tokenWindowToken)->strucRgn).rgnBBox.left;
  1161.                                                 
  1162.                             vOffset = (**((WindowPeek)theWindowPropToken.tokenWindowToken)->contRgn).rgnBBox.top -
  1163.                                                 (**((WindowPeek)theWindowPropToken.tokenWindowToken)->strucRgn).rgnBBox.top;
  1164.                                                 
  1165.                                                 
  1166.                             thePosn.v  += vOffset;
  1167.                             thePosn.h  += hOffset;
  1168.                             
  1169.                             MoveWindow(theWindowPropToken.tokenWindowToken,
  1170.                                                  thePosn.h,
  1171.                                                  thePosn.v,
  1172.                                                  false);
  1173.                                                  
  1174.                             ResizeWindow(theDocument);
  1175.                             break;
  1176.             
  1177.           case pIsZoomed:
  1178.                             err = GetBooleanFromDescriptor(dataDesc, &theBoolean);
  1179.                             if (theBoolean)
  1180.                                 ZoomWindow(qd.thePort,
  1181.                                                      inZoomOut,
  1182.                                                      false);
  1183.                             else
  1184.                                 ZoomWindow(qd.thePort,
  1185.                                                      inZoomIn,
  1186.                                                      false);
  1187.                                                                     
  1188.                             ResizeWindow(theDocument);
  1189.                             break;
  1190.             
  1191.             case pVisible:
  1192.                             err = GetBooleanFromDescriptor(dataDesc, &theBoolean);
  1193.                             if (theBoolean)
  1194.                                 ShowWindow(theWindowPropToken.tokenWindowToken);
  1195.                             else
  1196.                                 HideWindow(theWindowPropToken.tokenWindowToken);
  1197.                             break;
  1198.             
  1199.             case pPageSetup:
  1200.                             err = GetTHPrintFromDescriptor(dataDesc, &theTHPrint);
  1201.                                 
  1202.                             if (theTHPrint) 
  1203.                                 {
  1204.                                     if (theDocument->thePrintSetup) 
  1205.                                         DisposHandle((Handle)theDocument->thePrintSetup);
  1206.                                         
  1207.                                     theDocument->thePrintSetup = theTHPrint;
  1208.                                     theDocument->dirty = true;
  1209.                                     ResizePageSetupForDocument(theDocument);
  1210.                                 }
  1211.                             break;
  1212.                             
  1213.             case pShowBorders:
  1214.                             err = GetBooleanFromDescriptor(dataDesc, &theBoolean);
  1215.                             theDocument->showBorders = theBoolean;
  1216.                             if (theBoolean)
  1217.                                 DrawPageExtras(theDocument); /* Does the clipping as well as drawing borders/page breaks */
  1218.                             else
  1219.                                 InvalidateDocument(theDocument);
  1220.                             break;
  1221.                             
  1222.             case pSelection:
  1223.                             err = AECoerceDesc(dataDesc, typeMyText, &tokenDesc);
  1224.                             
  1225.                             GetRawDataFromDescriptor(&tokenDesc,
  1226.                                                                              (Ptr)&myTextToken,
  1227.                                                                              sizeof(myTextToken),
  1228.                                                                              &tokenSize);
  1229.                                                                                              
  1230.                             ignoreErr = AEDisposeDesc(&tokenDesc);
  1231.                             
  1232.                             if (err == noErr) 
  1233.                                 {
  1234.                                     /* got a text token */
  1235.                                     
  1236.                                     theDocument = DPtrFromWindowPtr(myTextToken.tokenWindow);
  1237.                                     theHTE      = theDocument->theText;
  1238.                                     
  1239.                                     TESetSelect(myTextToken.tokenOffset-1,
  1240.                                                             myTextToken.tokenOffset+myTextToken.tokenLength-1,
  1241.                                                             theHTE);
  1242.                                 }
  1243.                             break;
  1244.             
  1245.             case pIndex:
  1246.             case pIsModal:
  1247.             case pIsResizable:
  1248.             case pHasTitleBar:
  1249.             case pHasCloseBox:
  1250.             case pIsFloating:
  1251.             case pBestType:
  1252.             case pClass:
  1253.             case pDefaultType:
  1254.             case pIsZoomable:
  1255.             case pIsModified:
  1256.             default:
  1257.                             err = errAEEventNotHandled; /* We don't allow these to be set or we don't understand it*/
  1258.         }
  1259.         
  1260.         SetPort(oldPort);
  1261.         
  1262.         return(err);
  1263.                 
  1264.     } /* SetWindowProperty */
  1265.     
  1266. /* -----------------------------------------------------------------------
  1267.         Name:             AddDescStyleItem
  1268.         Purpose:        Adds the kAEXXXX style to theStyle.
  1269.      -----------------------------------------------------------------------**/
  1270.      
  1271. pascal void AddDescStyleItem(DescType theDesc, Style *theStyle)
  1272.     {
  1273.         if (theDesc == kAEBold)
  1274.             *theStyle = *theStyle+bold;
  1275.         else
  1276.         if (theDesc == kAEItalic)
  1277.             *theStyle = *theStyle+italic;
  1278.         else
  1279.         if (theDesc == kAEUnderline)
  1280.             *theStyle = *theStyle+underline;
  1281.         else
  1282.         if (theDesc == kAEOutline)
  1283.             *theStyle = *theStyle+outline;
  1284.         else
  1285.         if (theDesc == kAEShadow)
  1286.             *theStyle = *theStyle+shadow;
  1287.         else
  1288.         if (theDesc == kAECondensed)
  1289.             *theStyle = *theStyle+condense;
  1290.         else
  1291.         if (theDesc == kAEExpanded)
  1292.             *theStyle = *theStyle+extend;
  1293.         else
  1294.         if (theDesc == kAEPlain)
  1295.             *theStyle = 0;
  1296.     } /* AddDescStyleItem */
  1297.     
  1298. pascal OSErr MakeStyleFromAEList(const AEDescList *styleList, Style *theStyle, Boolean *hadPlain)
  1299.     {
  1300.         OSErr     myErr;
  1301.         DescType  styleDesc;
  1302.         long      itemsInList;
  1303.         long      actSize;
  1304.         AEKeyword keywd;
  1305.         DescType  typeCode;
  1306.             
  1307.         *hadPlain = false;
  1308.         *theStyle = 0;
  1309.         
  1310.       myErr = AECountItems(styleList, &itemsInList);
  1311.         while (itemsInList>0)
  1312.           if (myErr==noErr)
  1313.                 {
  1314.                     myErr  = AEGetNthPtr(styleList,
  1315.                                                              itemsInList,
  1316.                                                              typeEnumerated,
  1317.                                                              &keywd,
  1318.                                                              &typeCode,
  1319.                                                              (Ptr)&styleDesc,
  1320.                                                              sizeof(styleDesc),
  1321.                                                              &actSize);
  1322.                     
  1323.                     AddDescStyleItem(styleDesc, theStyle);
  1324.                     
  1325.                     if (styleDesc == kAEPlain) 
  1326.                       {
  1327.                             itemsInList = 0;
  1328.                             *hadPlain    = true;
  1329.                         }
  1330.                     else
  1331.                       itemsInList--;
  1332.                 }
  1333.                 
  1334.         return(myErr);
  1335.     } /*MakeStyleFromAEList*/
  1336.     
  1337. pascal OSErr GetTextStyles(const AEDesc *dataDesc, Style *onStyles, Style *offStyles)
  1338.     {
  1339.         OSErr      myErr;
  1340.         OSErr      ignoreErr;
  1341.         AEDescList textSDesc;
  1342.         AEDescList onDesc;
  1343.         AEDescList offDesc;
  1344.         Boolean    hadPlain;
  1345.             
  1346.       textSDesc.dataHandle = nil;
  1347.       onDesc.dataHandle    = nil;
  1348.       offDesc.dataHandle   = nil;
  1349.         
  1350.         *onStyles  = 0;
  1351.         *offStyles = 0;
  1352.         
  1353.       myErr = AECoerceDesc(dataDesc, typeAERecord, &textSDesc);
  1354.         
  1355.         if (myErr==noErr)
  1356.           myErr = AEGetKeyDesc(&textSDesc, keyAEOnStyles, typeAEList, &onDesc);
  1357.         
  1358.         if (myErr==noErr)
  1359.           myErr = AEGetKeyDesc(&textSDesc, keyAEOffStyles, typeAEList, &offDesc);
  1360.         
  1361.         if (myErr==noErr)
  1362.             myErr = MakeStyleFromAEList(&onDesc,  onStyles, &hadPlain);
  1363.             
  1364.         if (hadPlain)
  1365.             *offStyles = bold+italic+underline+outline+shadow+condense+extend;
  1366.         else
  1367.             {
  1368.                 if (myErr==noErr)
  1369.                     myErr = MakeStyleFromAEList(&offDesc, offStyles, &hadPlain);
  1370.         
  1371.                 if (hadPlain)
  1372.                     myErr = errAEEventFailed;
  1373.             }
  1374.             
  1375.         if (textSDesc.dataHandle)
  1376.             ignoreErr = AEDisposeDesc(&textSDesc);
  1377.             
  1378.         if (onDesc.dataHandle)
  1379.             ignoreErr = AEDisposeDesc(&onDesc);
  1380.             
  1381.         if (offDesc.dataHandle)
  1382.             ignoreErr = AEDisposeDesc(&offDesc);
  1383.         
  1384.         return(myErr);
  1385.     } /* GetTextStyles */
  1386.  
  1387. /* -----------------------------------------------------------------------
  1388.         Name:             SetTextProperty
  1389.         Purpose:        Sets the text property specfied by theTextPropToken to
  1390.                                 that in dataDesc.
  1391.      -----------------------------------------------------------------------**/
  1392.      
  1393. pascal OSErr SetTextProperty(const AEDesc *tokenDesc, const AEDesc *dataDesc)
  1394.     {
  1395.       TEHandle      theHTE;
  1396.         DPtr          theDoc;
  1397.         Str255        name;
  1398.         short         theSize;
  1399.         OSErr         myErr;
  1400.         OSErr         ignoreErr;
  1401.         Style         onStyle;
  1402.         Style         offStyle;
  1403.         textPropToken theTextPropToken;
  1404.         AEDesc        newDesc;
  1405.         Size          tokenSize;
  1406.         
  1407.       newDesc.dataHandle = nil;
  1408.         
  1409.       myErr = AECoerceDesc(tokenDesc, typeMyTextProp, &newDesc);
  1410.         if (myErr == noErr)
  1411.             {
  1412.                 GetRawDataFromDescriptor(&newDesc,
  1413.                                                                  (Ptr)&theTextPropToken,
  1414.                                                                  sizeof(theTextPropToken),
  1415.                                                                  &tokenSize);
  1416.                 ignoreErr = AEDisposeDesc(&newDesc);
  1417.             }
  1418.         else
  1419.             return(myErr);
  1420.             
  1421.         theDoc = DPtrFromWindowPtr(theTextPropToken.propertyTextToken.tokenWindow);
  1422.         theDoc->dirty = true;
  1423.         
  1424.         switch (theTextPropToken.propertyProperty) {
  1425.         
  1426.             case pContents:
  1427.                         theHTE = theDoc->theText;
  1428.                                     TESetSelect(theTextPropToken.propertyTextToken.tokenOffset-1,
  1429.                                                             theTextPropToken.propertyTextToken.tokenOffset+
  1430.                                                                                     theTextPropToken.propertyTextToken.tokenLength-1,
  1431.                                                             theHTE);
  1432.                                     
  1433.                                     if (OKToModifySelection(theDoc))
  1434.                                         {
  1435.                                             DoTEDeleteSectionRecalc(theDoc);
  1436.                                             TEDelete(theHTE);
  1437.                                             myErr = GetStyledTextFromDescIntoTEHandle(dataDesc, theHTE);
  1438.                                             RecalcChangedSectionBorders(theDoc);
  1439.                                         }
  1440.                                     else
  1441.                                         myErr = errCantWriteSubscriber;
  1442.                                         
  1443.                                     break;
  1444.             
  1445.             case pFont: myErr = GetPStringFromDescriptor(dataDesc, (char *)name);
  1446.                                     
  1447.                                     if (myErr==noErr)
  1448.                                         myErr = SetTheFontOfTheTokenText(theTextPropToken.propertyTextToken,
  1449.                                                                                                          name);
  1450.                                     break;
  1451.             
  1452.           case pPointSize:
  1453.                         myErr = GetIntegerFromDescriptor(dataDesc, &theSize);
  1454.                                     if (myErr==noErr)
  1455.                                         myErr = SetTheSizeOfTheTokenText(theTextPropToken.propertyTextToken,
  1456.                                                                                                           theSize);
  1457.                                     break;
  1458.                                     
  1459.             case pTextStyles:
  1460.                                     onStyle  = 0;
  1461.                                     offStyle = 0;
  1462.                                     
  1463.                                     myErr = GetTextStyles(dataDesc, &onStyle, &offStyle);
  1464.                     
  1465.                                     if (myErr==noErr)
  1466.                                         if (onStyle & offStyle != 0)
  1467.                                             myErr = errAEEventFailed;
  1468.                                         else
  1469.                                             myErr = SetTheStyleOfTheTokenText(&theTextPropToken.propertyTextToken,
  1470.                                                                                                                 onStyle,
  1471.                                                                                                                 offStyle);
  1472.                                     break;
  1473.                                     
  1474.             default: myErr = errAEWrongDataType;
  1475.             
  1476.         }
  1477.                         
  1478.         return(myErr);
  1479.             
  1480.     } /* SetTextProperty */
  1481.     
  1482. /* -----------------------------------------------------------------------
  1483.         Name:             HandleSetData
  1484.         Purpose:        Resolves the object into a token (could be one of many) and
  1485.                                 the sets the data of that object to dataDesc.
  1486.      -----------------------------------------------------------------------**/
  1487.      
  1488. pascal OSErr HandleSetData(const AEDesc *theObj, const AEDesc *dataDesc, AppleEvent *reply)
  1489. {
  1490.   OSErr           myErr;
  1491.   OSErr           ignoreErr;
  1492.     AEDesc          newDesc;
  1493.     DPtr            theDocument;
  1494.     TEHandle        theHTE;
  1495.     TextToken       theTextToken;
  1496.     Size            tokenSize;
  1497.     AEDesc          objTokenDesc;
  1498.     
  1499.     objTokenDesc.dataHandle = nil;
  1500.     newDesc.dataHandle      = nil;
  1501.     
  1502.     /*
  1503.         Coerce theObj into a token which we can use - 
  1504.              set the property or data for that token
  1505.     */
  1506.     
  1507.     myErr = AEResolve(theObj ,kAEIDoMinimum, &objTokenDesc);
  1508.         
  1509.     /* We don't actually allow ANY app property setting, but
  1510.        just incase we'll decode looking for an typeMyApplProp and flag an error -
  1511.          do same for menu related tokens
  1512.     */
  1513.     
  1514.     switch (objTokenDesc.descriptorType) {
  1515.         case typeMyWindowProp: myErr = SetWindowProperty(&objTokenDesc, dataDesc);
  1516.                                                      break;
  1517.         
  1518.         case typeMyTextProp :  myErr = SetTextProperty(&objTokenDesc, dataDesc);
  1519.                                break;
  1520.  
  1521.         case typeMyText:        if (AECoerceDesc(&objTokenDesc, typeMyText, &newDesc) == noErr) 
  1522.                                                         {
  1523.                                                             GetRawDataFromDescriptor(&newDesc,
  1524.                                                                                                              (Ptr)&theTextToken,
  1525.                                                                                                              sizeof(theTextToken),
  1526.                                                                                                              &tokenSize);
  1527.                                                                                                              
  1528.                                                             ignoreErr = AEDisposeDesc(&newDesc);
  1529.                                                                                                              
  1530.                                                             theDocument = DPtrFromWindowPtr(theTextToken.tokenWindow);
  1531.                                                             theHTE            = theDocument->theText;
  1532.                                                             
  1533.                                                             TESetSelect(theTextToken.tokenOffset-1,
  1534.                                                                                     theTextToken.tokenOffset+
  1535.                                                                                                             theTextToken.tokenLength-1,
  1536.                                                                                     theHTE);
  1537.                                                             
  1538.                                                             if (OKToModifySelection(theDocument))
  1539.                                                                 {
  1540.                                                                     DoTEDeleteSectionRecalc(theDocument);
  1541.                                                                     TEDelete(theHTE);
  1542.                                                                         
  1543.                                                                     myErr = GetStyledTextFromDescIntoTEHandle(dataDesc, theHTE);
  1544.                                                                     RecalcChangedSectionBorders(theDocument);
  1545.                                                                 }
  1546.                                                             else
  1547.                                                                 myErr = errCantWriteSubscriber;
  1548.                                                                 
  1549.                                                             theDocument->dirty = true;
  1550.                                                         }
  1551.                                                     break;
  1552.                                                     
  1553.         // Read only items and properties and those we don't know
  1554.         case typeMyApplProp:
  1555.         case typeMyMenu:
  1556.         case typeMyMenuProp:
  1557.         case typeMyMenuItem:
  1558.         case typeMyItemProp:                                                        
  1559.         default:            myErr = errAEWrongDataType;
  1560.     }
  1561.     
  1562.     if (objTokenDesc.dataHandle)
  1563.         ignoreErr = AEDisposeDesc(&objTokenDesc);
  1564.     
  1565.     if (myErr == errCantWriteSubscriber)
  1566.         AddErrorTextToReply("\pCannot write into subscriber", reply);
  1567.         
  1568.     return(myErr);
  1569. }    /* HandleSetData */
  1570.  
  1571. /*
  1572.     A few convenient FORWARDS...
  1573. */
  1574.  
  1575. pascal OSErr MakeWindowObj( WindowPtr theWindow, AEDesc *dMyDoc);
  1576. pascal OSErr MakeTextObj(WindowPtr theWindow,
  1577.                                                  short     selStart,
  1578.                                                  short     selEnd,
  1579.                                                  AEDesc    *selTextObj);
  1580.  
  1581. pascal OSErr MakeMenuObj(Str255 theName, AEDesc *resultingObj);
  1582. pascal OSErr MakeMenuItemObj(Str255 theName, short theItem, AEDesc *resultingObj);
  1583. pascal OSErr MakeClassObj(DescType theClass, AEDesc *myClassObj);
  1584. /*
  1585.     Back to real code
  1586. */
  1587. pascal OSErr MakeSelTextObj( WindowPtr theWindow,
  1588.                                                          TEHandle  theTextEditHandle,
  1589.                                                          AEDesc    *selTextObj)
  1590. /*
  1591.     This is a hack to get the AppleScript Alpha to work...
  1592. */
  1593.     {
  1594.         OSErr    myErr;
  1595.         OSErr    ignoreErr;
  1596.         AEDesc   dNull;
  1597.         AEDesc   dMyDoc;
  1598.         AEDesc   startOfs;
  1599.         AEDesc   endOfs;
  1600.         AEDesc   startObj;
  1601.         AEDesc   endObj;
  1602.         AEDesc   rangeDesc;
  1603.         long     startChar;
  1604.         long     endChar;
  1605.         Boolean  spotFlag;
  1606.             
  1607.         myErr = noErr;
  1608.         
  1609.         if (theWindow==nil) 
  1610.             return(noErr);
  1611.             
  1612.         selTextObj->dataHandle = nil;
  1613.         dMyDoc.dataHandle      = nil;
  1614.         startObj.dataHandle    = nil;
  1615.         endObj.dataHandle      = nil;
  1616.         
  1617.         /* 
  1618.             make the window object 
  1619.         */
  1620.         
  1621.         myErr = MakeWindowObj(theWindow, &dMyDoc);
  1622.             
  1623.         if (myErr==noErr)
  1624.             {
  1625.                 /* get the start and end of selection */
  1626.                 
  1627.                 startChar = (*theTextEditHandle)->selStart+1;    /* start counting obj's from 1, not 0 */
  1628.                 endChar   = (*theTextEditHandle)->selEnd;
  1629.                 spotFlag  = ((*theTextEditHandle)->selStart == (*theTextEditHandle)->selEnd);
  1630.                     
  1631.                 myErr = CreateOffsetDescriptor(startChar, &startOfs);
  1632.                             
  1633.                 if (myErr==noErr)
  1634.                     if (spotFlag)
  1635.                         myErr = CreateObjSpecifier(cSpot,
  1636.                                                                              &dMyDoc,
  1637.                                                                              formAbsolutePosition, 
  1638.                                                                              &startOfs, 
  1639.                                                                              true, 
  1640.                                                                              selTextObj);
  1641.                     else
  1642.                         {
  1643.                             /* not a spot - must represent as range */
  1644.                             /* make obj for start char */
  1645.                             
  1646.                             myErr = AECreateDesc(typeNull, nil , 0, &dNull);
  1647.                             
  1648.                             myErr = CreateObjSpecifier(cChar,
  1649.                                                        &dNull,
  1650.                                                                                  formAbsolutePosition,
  1651.                                                                                  &startOfs,
  1652.                                                                                  false,
  1653.                                                                                  &startObj);
  1654.                             
  1655.                             if (myErr==noErr) 
  1656.                                 myErr = CreateOffsetDescriptor(endChar, &endOfs);
  1657.                             
  1658.                             if (myErr==noErr) 
  1659.                                 myErr = CreateObjSpecifier(cChar,
  1660.                                                                                      &dNull,
  1661.                                                                                      formAbsolutePosition,
  1662.                                                                                      &endOfs,
  1663.                                                                                      false,
  1664.                                                                                      &endObj);
  1665.                             
  1666.                             if (myErr==noErr) 
  1667.                                 myErr = CreateRangeDescriptor(&startObj,
  1668.                                                                                             &endObj,
  1669.                                                                                             false,
  1670.                                                                                             &rangeDesc);
  1671.                             
  1672.                             if (myErr==noErr) 
  1673.                                 myErr = CreateObjSpecifier(cChar,
  1674.                                                                                      &dMyDoc,
  1675.                                                                                      formRange,
  1676.                                                                                      &rangeDesc,
  1677.                                                                                      true,
  1678.                                                                                      selTextObj);
  1679.                                                                                      
  1680.                             if (startObj.dataHandle)
  1681.                               ignoreErr = AEDisposeDesc(&startObj);
  1682.                                 
  1683.                             if (startOfs.dataHandle)
  1684.                               ignoreErr = AEDisposeDesc(&startOfs);
  1685.                                 
  1686.                             if (endObj.dataHandle)
  1687.                               ignoreErr = AEDisposeDesc(&endObj);
  1688.                                 
  1689.                             if (endOfs.dataHandle)
  1690.                               ignoreErr = AEDisposeDesc(&endOfs);
  1691.                         }
  1692.             }
  1693.             
  1694.         return(myErr);
  1695.     }    /* MakeSelTextObj */
  1696.  
  1697. /* -----------------------------------------------------------------------
  1698.         Name:             DoSetData
  1699.         Purpose:        Handles the SetData Apple Event, extracting the direct
  1700.                                 object (which says what to set) and the data (what to set
  1701.                                 it to).
  1702.      -----------------------------------------------------------------------**/
  1703.      
  1704. pascal OSErr DoSetData(const AppleEvent *theAppleEvent,
  1705.                                                AppleEvent *reply,
  1706.                                                          long        handlerRefCon)
  1707.   {
  1708. #pragma unused (reply, handlerRefCon)
  1709.     
  1710.         OSErr  myErr;
  1711.         OSErr  ignoreErr;
  1712.         AEDesc myDirObj;
  1713.         AEDesc myDataDesc;
  1714.         
  1715.         myDataDesc.dataHandle = nil;
  1716.         myDirObj.dataHandle   = nil;
  1717.                 
  1718.         /* pick up the direct object, which is the object whose data is to be set */
  1719.         
  1720.         myErr = AEGetParamDesc(theAppleEvent,
  1721.                                                      keyDirectObject,
  1722.                                                      typeWildCard,
  1723.                                                      &myDirObj);
  1724.             
  1725.         /* now the data to set it to - typeWildCard means get as is*/
  1726.         if (myErr == noErr) 
  1727.             myErr = AEGetParamDesc( theAppleEvent,
  1728.                                                             keyAEData,
  1729.                                                             typeWildCard,
  1730.                                                             &myDataDesc);
  1731.         
  1732.         /* missing any parameters? */
  1733.         if (myErr == noErr) 
  1734.             myErr = GotRequiredParams(theAppleEvent);
  1735.         
  1736.         /* set the data */
  1737.         if (myErr == noErr) 
  1738.             myErr = HandleSetData(&myDirObj, &myDataDesc, reply);
  1739.             
  1740.         if (myDataDesc.dataHandle)
  1741.             ignoreErr = AEDisposeDesc(&myDataDesc);
  1742.             
  1743.         if (myDirObj.dataHandle)
  1744.             ignoreErr = AEDisposeDesc(&myDirObj);
  1745.   
  1746.         return(myErr);
  1747.     }    /* DoSetData */
  1748.     
  1749. pascal void StyleTokConst(short theStyleItem, DescType *thekConst)
  1750.     {
  1751.         switch (theStyleItem) {
  1752.           case bold      : *thekConst = kAEBold;
  1753.                                              break;
  1754.       case italic    : *thekConst = kAEItalic;
  1755.                                              break;
  1756.       case underline : *thekConst = kAEUnderline;
  1757.                                              break;
  1758.       case outline   : *thekConst = kAEOutline;
  1759.                                              break;
  1760.             case shadow    : *thekConst = kAEShadow;
  1761.                                              break;
  1762.             case condense  : *thekConst = kAECondensed;
  1763.                                              break;
  1764.             case extend    : *thekConst = kAEExpanded;
  1765.                                              break;
  1766.         }
  1767.     } /*StyleTokConst*/
  1768.     
  1769. pascal OSErr BuildTypeTextStylesDesc(Style onStyles, Style offStyles, AEDesc *resultDesc)
  1770.     {
  1771.  
  1772.         OSErr     myErr;
  1773.         OSErr     ignoreErr;
  1774.         short     myStyleItem;
  1775.         DescType  styleConst;
  1776.         AEDesc    onStylesDesc;
  1777.         AEDesc    offStylesDesc;
  1778.         AEDesc    dataDesc;
  1779.         
  1780.         onStylesDesc.dataHandle  = nil;
  1781.         offStylesDesc.dataHandle = nil;
  1782.         dataDesc.dataHandle  = nil;
  1783.     
  1784.         myErr = AECreateList(nil, 0, true,  &dataDesc);
  1785.         
  1786.         myErr = AECreateList(nil, 0, false, &onStylesDesc);
  1787.         myErr = AECreateList(nil, 0, false, &offStylesDesc);
  1788.         
  1789.         for (myStyleItem = bold; myStyleItem<=extend; myStyleItem = myStyleItem <<1)
  1790.             if (myErr==noErr)
  1791.                 {
  1792.                     StyleTokConst(myStyleItem, &styleConst);
  1793.                     if (myStyleItem & onStyles)
  1794.                         myErr  = AEPutPtr(&onStylesDesc,
  1795.                                                             0,                /*add to end of list*/
  1796.                                                             typeEnumerated, /* text for style name */
  1797.                                                             (Ptr)&styleConst,
  1798.                                                             sizeof(styleConst));
  1799.                     
  1800.                     if (myStyleItem & offStyles)
  1801.                         myErr  = AEPutPtr(&offStylesDesc,
  1802.                                                             0,                /*add to end of list*/
  1803.                                                             typeEnumerated, /* text for style name */
  1804.                                                             (Ptr)&styleConst,
  1805.                                                             sizeof(styleConst));
  1806.             }
  1807.         
  1808.         if (myErr==noErr)
  1809.             myErr = AEPutKeyDesc(&dataDesc, keyAEOnStyles,  &onStylesDesc);
  1810.         
  1811.         if (myErr==noErr)
  1812.             myErr = AEPutKeyDesc(&dataDesc, keyAEOffStyles, &offStylesDesc);
  1813.         
  1814.         if (myErr==noErr)
  1815.             myErr = AECoerceDesc(&dataDesc, typeTextStyles, resultDesc);
  1816.             
  1817.         if (onStylesDesc.dataHandle)
  1818.             ignoreErr = AEDisposeDesc(&onStylesDesc);
  1819.             
  1820.         if (offStylesDesc.dataHandle)
  1821.             ignoreErr = AEDisposeDesc(&offStylesDesc);
  1822.             
  1823.         if (dataDesc.dataHandle)
  1824.             ignoreErr = AEDisposeDesc(&dataDesc);
  1825.     
  1826.         return(myErr);
  1827.     }
  1828.  
  1829. pascal OSErr BuildTextStylesDesc(Style theStyle, AEDesc *resultDesc)
  1830.     {
  1831.         short     myStyleItem;
  1832.         Style     onStyles;
  1833.         Style     offStyles;
  1834.                 
  1835.         onStyles  = 0;
  1836.         offStyles = 0;
  1837.         
  1838.         for (myStyleItem = bold; myStyleItem<=extend; myStyleItem = myStyleItem <<1)
  1839.             {
  1840.                 if (myStyleItem & theStyle)
  1841.                     onStyles  = onStyles  + myStyleItem;
  1842.                 else
  1843.                     offStyles = offStyles + myStyleItem;
  1844.             }
  1845.     
  1846.         return(BuildTypeTextStylesDesc(onStyles, offStyles, resultDesc));
  1847.         
  1848.     } /* BuildTextStylesDesc */
  1849.         
  1850. pascal OSErr BuildStyledTextDesc(TEHandle theHTE, short start, short howLong, AEDesc *resultDesc)
  1851.     {
  1852.         AEDesc       listDesc;
  1853.         short        oldSelStart;
  1854.         short        oldSelEnd;
  1855.         StScrpHandle myStScrpHandle;
  1856.         OSErr        myErr;
  1857.         OSErr        ignoreErr;
  1858.         
  1859.         listDesc.dataHandle = nil;
  1860.         
  1861.         oldSelStart = (**theHTE).selStart;
  1862.         oldSelEnd   = (**theHTE).selEnd;
  1863.         
  1864.         TESetSelect(start-1, start+howLong-2, theHTE);
  1865.         
  1866.         myErr = AECreateList(nil, 0, true,  &listDesc);
  1867.         
  1868.         HLock((Handle)(**theHTE).hText);
  1869.                                                          
  1870.         if (myErr==noErr)
  1871.             myErr = AEPutKeyPtr(&listDesc,
  1872.                                 keyAEText,
  1873.                                                     typeChar,
  1874.                                                     (Ptr)&(*(**theHTE).hText)[start-1],
  1875.                                                     howLong);
  1876.                                                     
  1877.         HUnlock((Handle)(**theHTE).hText);
  1878.         
  1879.         myStScrpHandle = GetStylScrap(theHTE);
  1880.         
  1881.         if (myStScrpHandle)
  1882.             {
  1883.                 HLock((Handle)myStScrpHandle);
  1884.                 
  1885.                 if (myErr==noErr)
  1886.                     myErr = AEPutKeyPtr(&listDesc,
  1887.                                         keyAEStyles,
  1888.                                                             typeScrapStyles,
  1889.                                                             (Ptr)*myStScrpHandle,
  1890.                                                             GetHandleSize((Handle)myStScrpHandle));
  1891.                     
  1892.                 HUnlock((Handle)myStScrpHandle);
  1893.             }    
  1894.         else
  1895.             myErr = AEPutKeyPtr(&listDesc,
  1896.                                                     keyAEStyles,
  1897.                                                     typeScrapStyles,
  1898.                                                     (Ptr)nil,
  1899.                                                     0);
  1900.         
  1901.         if (myErr==noErr)
  1902.             myErr = AECoerceDesc(&listDesc, typeStyledText, resultDesc); // should be typeIntlText
  1903.         
  1904.         if (listDesc.dataHandle)
  1905.             ignoreErr = AEDisposeDesc(&listDesc);
  1906.         
  1907.         TESetSelect(oldSelStart, oldSelEnd, theHTE);
  1908.         
  1909.         return(myErr);
  1910.     }
  1911.     
  1912. /* -----------------------------------------------------------------------
  1913.         Name:             GetTextProperty
  1914.         Purpose:        Fills dataDesc with the requested text property.
  1915.      -----------------------------------------------------------------------**/
  1916.      
  1917. pascal OSErr GetTextProperty(const AEDesc *theTokenDesc, AEDesc *dataDesc)
  1918.     {
  1919.       DPtr          theDocument;
  1920.         TEHandle      theHTE;
  1921.         Str255        fontName;
  1922.         short         theSize;
  1923.         GrafPtr       oldPort;
  1924.         TextStyle     theTextStyle;
  1925.         short         lineHeight;
  1926.         short         fontAscent;
  1927.         textPropToken theTextPropToken;
  1928.         OSErr         myErr;
  1929.         OSErr                    ignoreErr;
  1930.         Size          tokenSize;
  1931.         AEDesc        newDesc;
  1932.         
  1933.       myErr = AECoerceDesc(theTokenDesc, typeMyTextProp, &newDesc);
  1934.         if (myErr == noErr)
  1935.             {
  1936.                 GetRawDataFromDescriptor(&newDesc,
  1937.                                                                  (Ptr)&theTextPropToken,
  1938.                                                                  sizeof(theTextPropToken),
  1939.                                                                  &tokenSize);
  1940.                 ignoreErr= AEDisposeDesc(&newDesc);                                                 
  1941.             }
  1942.         else
  1943.           return(myErr);
  1944.  
  1945.         /*
  1946.             For each property we build a descriptor to be returned as the reply.
  1947.         */
  1948.                 
  1949.         theDocument = DPtrFromWindowPtr(theTextPropToken.propertyTextToken.tokenWindow);
  1950.         theHTE             = theDocument->theText;
  1951.         
  1952.         TEGetStyle (theTextPropToken.propertyTextToken.tokenOffset-1,
  1953.                                 &theTextStyle,
  1954.                                 &lineHeight,
  1955.                                 &fontAscent,
  1956.                                 theHTE);
  1957.                                         
  1958.         switch (theTextPropToken.propertyProperty){ 
  1959.  
  1960.             case pContents:
  1961.             
  1962.                     myErr = BuildStyledTextDesc(theHTE,
  1963.                                                                             theTextPropToken.propertyTextToken.tokenOffset,
  1964.                                                                             theTextPropToken.propertyTextToken.tokenLength,
  1965.                                                                             dataDesc);
  1966.                     break;
  1967.             
  1968.             case pFont:
  1969.             
  1970.                     GetFontName(theTextStyle.tsFont, fontName);
  1971.                     
  1972.                     myErr = AECreateDesc(typeChar,
  1973.                                                              (Ptr)&fontName[1],
  1974.                                                              fontName[0],
  1975.                                                              dataDesc);
  1976.                     break;
  1977.                     
  1978.             case pTextStyles:
  1979.             
  1980.                     myErr = BuildTextStylesDesc(theTextStyle.tsFace, dataDesc);
  1981.                     break;
  1982.  
  1983.             case pPointSize:
  1984.  
  1985.                     myErr =CreateOffsetDescriptor(theTextStyle.tsSize, dataDesc);
  1986.                     break;
  1987.                     
  1988.             case pScriptTag:
  1989.                     
  1990.                     myErr = CreateOffsetDescriptor(smSystemScript, dataDesc);
  1991.                     break;
  1992.             
  1993.             case pStringWidth:
  1994.                 
  1995.                     GetPort(&oldPort);
  1996.                     SetPort(theTextPropToken.propertyTextToken.tokenWindow);
  1997.                     
  1998.                     HLock((Handle)(**theHTE).hText);
  1999.                     theSize = TextWidth(&(**theHTE).hText,
  2000.                                                             theTextPropToken.propertyTextToken.tokenOffset-1,
  2001.                                                             theTextPropToken.propertyTextToken.tokenLength);
  2002.                     
  2003.                     HUnlock((Handle)(**theHTE).hText);
  2004.                     
  2005.                     SetPort(oldPort);
  2006.                     myErr = CreateOffsetDescriptor(theSize, dataDesc);
  2007.                     
  2008.                     break;
  2009.             
  2010.             case pColor:
  2011.             
  2012.                     myErr = AECreateDesc(typeRGBColor,
  2013.                                                              (Ptr)&theTextStyle.tsColor,
  2014.                                                              sizeof(theTextStyle.tsColor),
  2015.                                                              dataDesc);
  2016.                     break;
  2017.  
  2018.             case pDefaultType:
  2019.             case pBestType:
  2020.             
  2021.                     myErr = MakeTextObj(theTextPropToken.propertyTextToken.tokenWindow,
  2022.                                                          theTextPropToken.propertyTextToken.tokenOffset-1,
  2023.                                                          theTextPropToken.propertyTextToken.tokenOffset+
  2024.                                                          theTextPropToken.propertyTextToken.tokenLength-1,
  2025.                                                          dataDesc);
  2026.                     break;
  2027.  
  2028.             case pClass:
  2029.             
  2030.                     myErr = MakeClassObj(cChar, dataDesc);
  2031.                     break;
  2032.                     
  2033.             default:
  2034.                     myErr = errAEEventNotHandled;
  2035.         }
  2036.         return(myErr);
  2037.         
  2038.     } /*GetTextProperty*/
  2039.     
  2040. /* -----------------------------------------------------------------------
  2041.         Name:             GetWindowProperty
  2042.         Purpose:        Fills dataDesc with the requested window property.
  2043.      -----------------------------------------------------------------------**/
  2044. typedef Rect **RectHandle;
  2045.  
  2046. pascal OSErr GetWindowProperty(const AEDesc *theWPTokenObj, AEDesc *dataDesc)
  2047.   {             
  2048.     OSErr           theErr;
  2049.         OSErr           ignoreErr;
  2050.         Str255          theName;
  2051.         Boolean         theBoolean;
  2052.         Rect            theRect;
  2053.         Point           thePoint;
  2054.         Rect            winRect;
  2055.         Rect            userRect;
  2056.         short           theIndex;
  2057.         DPtr            theDocument;
  2058.         TEHandle        theHTE;
  2059.         windowPropToken theWindowPropToken;
  2060.         AEDesc          newDesc;
  2061.         Size            tokenSize;
  2062.         
  2063.       theErr = AECoerceDesc(theWPTokenObj,typeMyWindowProp, &newDesc);
  2064.         
  2065.         if (theErr == noErr)
  2066.             {
  2067.                 GetRawDataFromDescriptor(&newDesc,
  2068.                                                                  (Ptr)&theWindowPropToken,
  2069.                                                                  sizeof(theWindowPropToken),
  2070.                                                                  &tokenSize);
  2071.                                                                  
  2072.                 ignoreErr = AEDisposeDesc(&newDesc);
  2073.             }
  2074.         else
  2075.           return(theErr);
  2076.             
  2077.         switch (theWindowPropToken.tokenProperty) { 
  2078.             
  2079.             case pName:
  2080.             
  2081.                 GetWTitle(theWindowPropToken.tokenWindowToken, theName);
  2082.                 theErr = AECreateDesc(typeChar,
  2083.                                                             (Ptr)&theName[1],
  2084.                                                             theName[0],
  2085.                                                             dataDesc);
  2086.                 break;
  2087.             
  2088.             case pContents:
  2089.             
  2090.                 theDocument = DPtrFromWindowPtr(theWindowPropToken.tokenWindowToken);
  2091.                 theHTE      = theDocument->theText;
  2092.                 
  2093.                 theErr = BuildStyledTextDesc( theHTE,
  2094.                                                                             1,
  2095.                                                                             (**theHTE).teLength,
  2096.                                                                             dataDesc);
  2097.                 break;
  2098.             
  2099.             case pBounds:
  2100.             
  2101.                 SetPort(theWindowPropToken.tokenWindowToken);
  2102.  
  2103.                 theRect = (*((WindowPeek)theWindowPropToken.tokenWindowToken)->strucRgn)->rgnBBox;
  2104.                 
  2105.                 theErr  = AECreateDesc(typeQDRectangle,
  2106.                                                              (Ptr)&theRect,
  2107.                                                              sizeof(theRect),
  2108.                                                              dataDesc);
  2109.                 break;
  2110.             
  2111.             case pPosition:
  2112.             
  2113.                 thePoint.v = (*((WindowPeek)theWindowPropToken.tokenWindowToken)->strucRgn)->rgnBBox.top;
  2114.                 thePoint.h = (*((WindowPeek)theWindowPropToken.tokenWindowToken)->strucRgn)->rgnBBox.left;
  2115.                             
  2116.                 theErr   = AECreateDesc(typeQDPoint,
  2117.                                                               (Ptr)&thePoint,
  2118.                                                               sizeof(thePoint),
  2119.                                                               dataDesc);
  2120.                 break;
  2121.                         
  2122.             case pVisible:
  2123.             
  2124.                 theBoolean = ((WindowPeek)theWindowPropToken.tokenWindowToken)->visible;
  2125.                                 
  2126.                 theErr  = AECreateDesc(typeBoolean,
  2127.                                                              (Ptr)&theBoolean,
  2128.                                                              sizeof(theBoolean),
  2129.                                                              dataDesc);
  2130.                 break;
  2131.             
  2132.             case pIsModal:
  2133.             
  2134.                 theBoolean = false;
  2135.                                 
  2136.                 theErr  = AECreateDesc(typeBoolean,
  2137.                                                              (Ptr)&theBoolean,
  2138.                                                              sizeof(theBoolean),
  2139.                                                              dataDesc);
  2140.                 break;
  2141.             
  2142.             case pShowBorders:
  2143.             
  2144.                 theDocument  = DPtrFromWindowPtr(theWindowPropToken.tokenWindowToken);
  2145.                 theBoolean   = theDocument->showBorders;
  2146.                                 
  2147.                 theErr  = AECreateDesc(typeBoolean,
  2148.                                                              (Ptr)&theBoolean,
  2149.                                                              sizeof(theBoolean),
  2150.                                                              dataDesc);
  2151.                 break;
  2152.             
  2153.             case pIsZoomed:
  2154.             
  2155.                 if (((WindowPeek)theWindowPropToken.tokenWindowToken)->spareFlag) 
  2156.                     {
  2157.                         SetPort(theWindowPropToken.tokenWindowToken);
  2158.                         
  2159.                         userRect = **((RectHandle)((WindowPeek)qd.thePort)->dataHandle);
  2160.                         winRect  = qd.thePort->portRect;
  2161.                         LocalToGlobal((Point *)&winRect.top);
  2162.                         LocalToGlobal((Point *)&winRect.bottom);
  2163.                         
  2164.                         theBoolean = !EqualRect(&userRect, &winRect);
  2165.                     }
  2166.                 else
  2167.                     theBoolean = false;
  2168.                                 
  2169.                 theErr  = AECreateDesc(typeBoolean,
  2170.                                                              (Ptr)&theBoolean,
  2171.                                                              sizeof(theBoolean),
  2172.                                                              dataDesc);
  2173.                 break;
  2174.             
  2175.             case pIsResizable:
  2176.             case pHasTitleBar:
  2177.             case pHasCloseBox:
  2178.             case pIsZoomable :
  2179.             
  2180.                 theBoolean = true;
  2181.                                 
  2182.                 theErr  = AECreateDesc(typeBoolean,
  2183.                                                              (Ptr)&theBoolean,
  2184.                                                              sizeof(theBoolean),
  2185.                                                              dataDesc);
  2186.                 break;
  2187.         
  2188.             case pIsFloating:
  2189.             
  2190.                 theBoolean = false;
  2191.                                 
  2192.                 theErr  = AECreateDesc(typeBoolean,
  2193.                                                              (Ptr)&theBoolean,
  2194.                                                              sizeof(theBoolean),
  2195.                                                              dataDesc);
  2196.                 break;
  2197.             
  2198.             case pIsModified:
  2199.             
  2200.                 theDocument = DPtrFromWindowPtr(theWindowPropToken.tokenWindowToken);
  2201.                 
  2202.                 theBoolean  = theDocument->dirty;
  2203.                 
  2204.                 theErr  = AECreateDesc(typeBoolean,
  2205.                                                              (Ptr)&theBoolean,
  2206.                                                              sizeof(theBoolean),
  2207.                                                              dataDesc);
  2208.                 break;
  2209.             
  2210.             case pIndex:
  2211.             
  2212.                 theIndex = 0;
  2213.                 if (theWindowPropToken.tokenWindowToken) 
  2214.                     do
  2215.                         theIndex++;
  2216.                     while (theWindowPropToken.tokenWindowToken != GetWindowPtrOfNthWindow(theIndex));
  2217.                                 
  2218.                 theErr  = AECreateDesc(typeShortInteger,
  2219.                                                              (Ptr)&theIndex,
  2220.                                                              sizeof(theIndex),
  2221.                                                              dataDesc);
  2222.                 break;
  2223.             
  2224.             case pPageSetup:
  2225.             
  2226.                 theDocument = DPtrFromWindowPtr(theWindowPropToken.tokenWindowToken);
  2227.                 
  2228.                 HLock((Handle)theDocument->thePrintSetup);
  2229.                 
  2230.                 theErr  = AECreateDesc(typeTPrint,
  2231.                                                              (Ptr)*(theDocument->thePrintSetup),
  2232.                                                              sizeof(TPrint),
  2233.                                                              dataDesc);
  2234.                                                              
  2235.                 HUnlock((Handle)theDocument->thePrintSetup);
  2236.                                                              
  2237.                 break;
  2238.             
  2239.             case pSelection:
  2240.             
  2241.                 theDocument = DPtrFromWindowPtr(theWindowPropToken.tokenWindowToken);
  2242.                 
  2243.                 theErr  = MakeSelTextObj( theWindowPropToken.tokenWindowToken,
  2244.                                                                     theDocument->theText, 
  2245.                                                                     dataDesc);                                                             
  2246.                 break;
  2247.             
  2248.             case pDefaultType:
  2249.             case pBestType:
  2250.             
  2251.                 theErr  = MakeWindowObj(theWindowPropToken.tokenWindowToken,
  2252.                                                                 dataDesc);                                                             
  2253.                 break;
  2254.             
  2255.             case pClass:
  2256.             
  2257.                 theErr  = MakeClassObj(cWindow, dataDesc);                                                             
  2258.                 break;
  2259.                 
  2260.         default:
  2261.                 theErr = errAEEventNotHandled;
  2262.         }
  2263.         return(theErr);
  2264.     } /* GetWindowProperty */
  2265.     
  2266. /** -----------------------------------------------------------------------
  2267.         Name:             GetApplicationProperty
  2268.         Purpose:        Fills dataDesc with the requested application property.
  2269.      -----------------------------------------------------------------------**/
  2270.      
  2271. pascal OSErr GetApplicationProperty(const AEDesc *theObjToken, AEDesc *dataDesc)
  2272.     {
  2273.       OSErr         theErr;
  2274.         OSErr         ignoreErr;
  2275.         Str255        theName;
  2276.         Boolean       isFront;
  2277.         applPropToken theApplPropToken;
  2278.         AEDesc        newDesc;
  2279.         Size          tokenSize;
  2280.         
  2281.         theErr = AECoerceDesc(theObjToken, typeMyApplProp, &newDesc);
  2282.         if (theErr==noErr)
  2283.             {
  2284.                 GetRawDataFromDescriptor(&newDesc,
  2285.                                                                  (Ptr)&theApplPropToken,
  2286.                                                                  sizeof(theApplPropToken),
  2287.                                                                  &tokenSize);
  2288.                                                                  
  2289.                 ignoreErr = AEDisposeDesc(&newDesc);
  2290.             }
  2291.         else
  2292.           return(theErr);
  2293.  
  2294.         theErr = kAEGenericErr;
  2295.         
  2296.         switch (theApplPropToken.tokenApplProperty) {
  2297.         
  2298.             case pName:
  2299.             
  2300.                     PLstrcpy((StringPtr)theName, "\pMenuScripter");
  2301.                     theErr  = AECreateDesc(typeChar,
  2302.                                                                  (Ptr)&theName[1],
  2303.                                                                  theName[0],
  2304.                                                                  dataDesc);
  2305.                     break;
  2306.             
  2307.             case pVersion:
  2308.             
  2309.                     PLstrcpy((StringPtr)theName, "\p1.0d4");
  2310.                     theErr  = AECreateDesc(typeChar,
  2311.                                                                  (Ptr)&theName[1],
  2312.                                                                  theName[0],
  2313.                                                                  dataDesc);
  2314.                     break;
  2315.         
  2316.             case pIsFrontProcess:
  2317.             
  2318.                     isFront = !gInBackground;
  2319.                     theErr  = AECreateDesc(typeBoolean,
  2320.                                                                  (Ptr)&isFront,
  2321.                                                                  sizeof(isFront),
  2322.                                                                  dataDesc);
  2323.                     break;
  2324.         
  2325.             case pDefaultType:
  2326.             case pBestType:
  2327.             
  2328.                     theErr  = AECreateDesc(typeNull,
  2329.                                                                  nil,
  2330.                                                                  0,
  2331.                                                                  dataDesc);
  2332.                     break;
  2333.             
  2334.             case pClass: 
  2335.             
  2336.                     theErr  = MakeClassObj(cApplication, dataDesc);
  2337.                     break;
  2338.             
  2339.             default:
  2340.             
  2341.                     theErr = errAEEventNotHandled;
  2342.         }
  2343.         
  2344.         return(theErr);
  2345.         
  2346.     } /* GetApplicationProperty */
  2347.      
  2348. /** -----------------------------------------------------------------------
  2349.         Name:             GetMenuProperty
  2350.         Purpose:        Fills dataDesc with the requested menu property.
  2351.      -----------------------------------------------------------------------**/
  2352.      
  2353. pascal OSErr GetMenuProperty(const AEDesc *theObjToken, AEDesc *dataDesc)
  2354.     {
  2355.       OSErr         theErr;
  2356.         OSErr         ignoreErr;
  2357.         Str255        theName;
  2358.         MenuPropToken theMenuPropToken;
  2359.         AEDesc        newDesc;
  2360.         Size          tokenSize;
  2361.         short         activeItem;
  2362.         
  2363.         theErr = AECoerceDesc(theObjToken, typeMyMenuProp, &newDesc);
  2364.         if (theErr==noErr)
  2365.             {
  2366.                 GetRawDataFromDescriptor(&newDesc,
  2367.                                                                  (Ptr)&theMenuPropToken,
  2368.                                                                  sizeof(theMenuPropToken),
  2369.                                                                  &tokenSize);
  2370.                                                                  
  2371.                 ignoreErr = AEDisposeDesc(&newDesc);
  2372.             }
  2373.         else
  2374.           return(theErr);
  2375.  
  2376.         switch (theMenuPropToken.theMenuProp) {
  2377.             case pName : 
  2378.             
  2379.                     PLstrcpy(theName, (**theMenuPropToken.theMenuToken.theTokenMenu).menuData);
  2380.                     theErr  = AECreateDesc(typeChar,
  2381.                                                                  (Ptr)&theName[1],
  2382.                                                                  theName[0],
  2383.                                                                  dataDesc);
  2384.                     break;
  2385.                 
  2386.             case pMenuID:
  2387.             
  2388.                     theErr  = AECreateDesc(typeShortInteger,
  2389.                                                                  (Ptr)&theMenuPropToken.theMenuToken.theTokenID,
  2390.                                                                  sizeof(theMenuPropToken.theMenuToken.theTokenID),
  2391.                                                                  dataDesc);
  2392.                     break;
  2393.                     
  2394.             case pActiveItem:
  2395.             
  2396.                     activeItem = GetScriptActiveItem();
  2397.                 
  2398.                     theErr  = AECreateDesc(typeShortInteger,
  2399.                                                                  (Ptr)&activeItem,
  2400.                                                                  sizeof(activeItem),
  2401.                                                                  dataDesc);
  2402.                     break;    
  2403.             
  2404.             case pDefaultType:
  2405.             case pBestType:
  2406.             
  2407.                     PLstrcpy(theName, (**theMenuPropToken.theMenuToken.theTokenMenu).menuData);
  2408.                     
  2409.                     theErr  = MakeMenuObj(theName, dataDesc);
  2410.                     break;
  2411.             
  2412.             case pClass:
  2413.             
  2414.                     theErr  = MakeClassObj(cMenu, dataDesc);
  2415.                     
  2416.                     break;
  2417.                     
  2418.          default:
  2419.                     theErr = errAEEventNotHandled;
  2420.         }
  2421.         
  2422.         return(theErr);
  2423.     } /* GetMenuProperty */
  2424.     
  2425. /** -----------------------------------------------------------------------
  2426.         Name:             GetMenuItemProperty
  2427.         Purpose:        Fills dataDesc with the requested menu property.
  2428.      -----------------------------------------------------------------------**/
  2429.      
  2430. pascal OSErr GetMenuItemProperty(const AEDesc *theObjToken, AEDesc *dataDesc)
  2431.     {
  2432.       OSErr             theErr;
  2433.         OSErr             ignoreErr;
  2434.         Str255            theName;
  2435.         MenuItemPropToken theMenuItemPropToken;
  2436.         AEDesc            newDesc;
  2437.         Size              tokenSize;
  2438.         
  2439.         theErr = AECoerceDesc(theObjToken, typeMyItemProp, &newDesc);
  2440.         if (theErr==noErr)
  2441.             {
  2442.                 GetRawDataFromDescriptor(&newDesc,
  2443.                                                                  (Ptr)&theMenuItemPropToken,
  2444.                                                                  sizeof(theMenuItemPropToken),
  2445.                                                                  &tokenSize);
  2446.                                                                  
  2447.                 ignoreErr = AEDisposeDesc(&newDesc);
  2448.             }
  2449.         else
  2450.           return(theErr);
  2451.  
  2452.         switch (theMenuItemPropToken.theItemProp) {
  2453.         
  2454.             case pName :
  2455.                             GetItem(theMenuItemPropToken.theItemToken.theMenuToken.theTokenMenu,
  2456.                                             theMenuItemPropToken.theItemToken.theTokenItem,
  2457.                                             theName);
  2458.                             theErr  = AECreateDesc(typeChar,
  2459.                                                                          (Ptr)&theName[1],
  2460.                                                                          theName[0],
  2461.                                                                          dataDesc);
  2462.                             break;
  2463.             
  2464.             case pItemNumber:
  2465.         
  2466.                             theErr  = AECreateDesc(typeShortInteger,
  2467.                                                                          (Ptr)&theMenuItemPropToken.theItemToken.theTokenItem,
  2468.                                                                          sizeof(theMenuItemPropToken.theItemToken.theTokenItem),
  2469.                                                                          dataDesc);
  2470.                             break;
  2471.                             
  2472.             case pDefaultType:
  2473.             case pBestType:
  2474.                             
  2475.                             PLstrcpy(theName, (**theMenuItemPropToken.theItemToken.theMenuToken.theTokenMenu).menuData);
  2476.                             
  2477.                             theErr  = MakeMenuItemObj(theName,
  2478.                                                                                 theMenuItemPropToken.theItemToken.theTokenItem,
  2479.                                                                                 dataDesc);
  2480.                             break;
  2481.                             
  2482.             case pClass:
  2483.                             
  2484.                             theErr  = MakeClassObj(cMenuItem, dataDesc);
  2485.                             break;
  2486.                             
  2487.             default: 
  2488.                             theErr = errAEEventNotHandled;
  2489.                             
  2490.         }
  2491.             
  2492.         return(theErr);
  2493.     } /* GetMenuItemProperty */
  2494.  
  2495. /** -----------------------------------------------------------------------
  2496.         Name:             HandleGetData
  2497.         Purpose:        Coerces theObj into a token which we understand and
  2498.                                 extracts the data requested in the token and puts it
  2499.                                 into dataDesc.
  2500.      -----------------------------------------------------------------------**/
  2501.      
  2502. typedef char chars[32001];
  2503. typedef chars **charsHandle;
  2504.  
  2505. pascal OSErr HandleGetData(AEDesc *theObj, DescType whatType, AEDesc *dataDesc)
  2506.   {
  2507. #pragma unused (whatType)
  2508.  
  2509.       OSErr           myErr;
  2510.         OSErr                        ignoreErr;
  2511.         AEDesc          newDesc;
  2512.         TextToken       theTextToken;
  2513.         Size            tokenSize;
  2514.         DPtr            theDoc;
  2515.         AEDesc          objTokenDesc;
  2516.         
  2517.         /*
  2518.             Resolve theObj into a token which we can use - 
  2519.                  get the property or data for that token
  2520.         */    
  2521.     
  2522.         myErr = AEResolve(theObj ,kAEIDoMinimum, &objTokenDesc);
  2523.         
  2524.         if (myErr == noErr)    
  2525.             switch (objTokenDesc.descriptorType){
  2526.             
  2527.                 case typeMyApplProp : myErr = GetApplicationProperty(&objTokenDesc, dataDesc);
  2528.                                                             break;
  2529.                                                             
  2530.                 case typeMyMenuProp : myErr = GetMenuProperty(&objTokenDesc, dataDesc);
  2531.                                                             break;
  2532.                 
  2533.                 case typeMyItemProp : myErr = GetMenuItemProperty(&objTokenDesc, dataDesc);
  2534.                                                             break;
  2535.                 
  2536.                 case typeMyTextProp : myErr = GetTextProperty(&objTokenDesc, dataDesc);
  2537.                                                             break;
  2538.                 
  2539.                 case typeMyWindowProp:myErr = GetWindowProperty(&objTokenDesc, dataDesc);
  2540.                                                             break;
  2541.                 
  2542.                 case typeMyText     :if (AECoerceDesc(&objTokenDesc, typeMyText, &newDesc) == noErr) 
  2543.                                                             {
  2544.                                                                 GetRawDataFromDescriptor(&newDesc,
  2545.                                                                                                                  (Ptr)&theTextToken,
  2546.                                                                                                                  sizeof(theTextToken),
  2547.                                                                                                                  &tokenSize);
  2548.                                                                 
  2549.                                                                 ignoreErr = AEDisposeDesc(&newDesc);
  2550.                                                                                                                  
  2551.                                                                 theDoc = DPtrFromWindowPtr(theTextToken.tokenWindow);
  2552.                                                                 
  2553.                                                                 myErr = BuildStyledTextDesc(theDoc->theText,
  2554.                                                                                                                         theTextToken.tokenOffset,
  2555.                                                                                                                         theTextToken.tokenLength,
  2556.                                                                                                                         dataDesc);
  2557.                                             
  2558.                                                             }
  2559.                                                          break;
  2560.                                                          
  2561.                 default : myErr = errAEWrongDataType;
  2562.             }
  2563.         return(myErr);
  2564.     }    /* HandleGetData */
  2565.  
  2566. /** -----------------------------------------------------------------------
  2567.         Name:             CheckSender
  2568.         Purpose:        Finds the Sender of the AppleEvent.
  2569.      -----------------------------------------------------------------------**/
  2570.      
  2571. pascal void CheckSender(const AppleEvent *theAppleEvent)
  2572.     {
  2573.         OSErr    myErr;
  2574.         TargetID sender;
  2575.         DescType returnedType;
  2576.         Size     actSize;
  2577.         
  2578.         myErr = AEGetAttributePtr(theAppleEvent,
  2579.                                                             keyAddressAttr,
  2580.                                                             typeTargetID,
  2581.                                                             &returnedType,
  2582.                                                             (Ptr)&sender,
  2583.                                                             sizeof(sender),
  2584.                                                             &actSize);
  2585.                                                             
  2586.         // DebugStr((Str255)sender.name.name);
  2587.     }
  2588.  
  2589. /** -----------------------------------------------------------------------
  2590.         Name:             DoGetData
  2591.         Purpose:        Handles the GetData AppleEvent.
  2592.      -----------------------------------------------------------------------**/
  2593.  
  2594. pascal OSErr DoGetData(const AppleEvent *theAppleEvent,
  2595.                                          AppleEvent *reply,
  2596.                                          long handlerRefCon)
  2597.     { 
  2598. #pragma unused (handlerRefCon)
  2599.  
  2600.         OSErr    myErr;
  2601.         OSErr    tempErr;
  2602.         AEDesc   myDirObj;
  2603.         AEDesc   myDataDesc;
  2604.         Size     actualSize;
  2605.         DescType returnedType;
  2606.         DescType reqType;
  2607.         
  2608.         myDataDesc.dataHandle = nil;
  2609.         myDirObj.dataHandle   = nil;
  2610.         
  2611.         /*
  2612.             CheckSender(theAppleEvent);
  2613.         */
  2614.         
  2615.         /*
  2616.             extract the direct object, which is the object whose data is to be returned
  2617.         */
  2618.         
  2619.         myErr  = AEGetParamDesc(theAppleEvent,
  2620.                                                         keyDirectObject,
  2621.                                                         typeWildCard,
  2622.                                                         &myDirObj);
  2623.             
  2624.         /*
  2625.             now the get the type of data wanted - optional
  2626.         */
  2627.         
  2628.         tempErr = AEGetParamPtr(theAppleEvent,
  2629.                                                         keyAERequestedType,
  2630.                                                         typeType,
  2631.                                                         &returnedType,
  2632.                                                         (Ptr)&reqType,
  2633.                                                         sizeof(reqType),
  2634.                                                         &actualSize);
  2635.         if (tempErr!=noErr) 
  2636.             reqType = typeChar;
  2637.             
  2638.         if (myErr == noErr) 
  2639.             myErr = GotRequiredParams(theAppleEvent);
  2640.         
  2641.         /* get the data */
  2642.         if (myErr == noErr) 
  2643.             myErr = HandleGetData(&myDirObj, reqType, &myDataDesc);
  2644.             
  2645.         /* if they wanted a reply, attach it now */
  2646.         if (myErr==noErr) 
  2647.             if (reply->descriptorType != typeNull) 
  2648.                 myErr = AEPutParamDesc(reply, keyDirectObject, &myDataDesc);
  2649.                 
  2650.     if (myDataDesc.dataHandle)
  2651.           tempErr = AEDisposeDesc(&myDataDesc);
  2652.  
  2653.     if (myDirObj.dataHandle)
  2654.           tempErr = AEDisposeDesc(&myDirObj);
  2655.             
  2656.         return(myErr);
  2657.     }    /* DoGetData */
  2658.  
  2659.  
  2660. /** -----------------------------------------------------------------------
  2661.         Name:             DoGetDataSize
  2662.         Purpose:        Handles the GetDataSize AppleEvent.
  2663.      -----------------------------------------------------------------------**/
  2664.  
  2665. pascal OSErr DoGetDataSize(const AppleEvent *theAppleEvent,
  2666.                                                         AppleEvent *reply,
  2667.                                                                  long       handlerRefCon)
  2668.   { 
  2669. #pragma unused (handlerRefCon)
  2670.     
  2671.         OSErr     myErr;
  2672.         OSErr     tempErr;
  2673.         AEDesc    myDirObj;
  2674.         AEDesc    myDataDesc;
  2675.         Size      actualSize;
  2676.         DescType  returnedType;
  2677.         DescType  reqType;
  2678.         long      dataSize;
  2679.         
  2680.         myDataDesc.dataHandle = nil;
  2681.         myDirObj.dataHandle   = nil;
  2682.         
  2683.         /* pick up the direct object, which is the object whose data is to be sized */
  2684.         
  2685.         myErr  = AEGetParamDesc(theAppleEvent,
  2686.                                                         keyDirectObject,
  2687.                                                         typeWildCard,
  2688.                                                         &myDirObj);
  2689.             
  2690.         /* now the get the type wanted - optional*/
  2691.         
  2692.         tempErr = AEGetParamPtr(theAppleEvent,
  2693.                                                         keyAERequestedType,
  2694.                                                         typeType,
  2695.                                                         &returnedType,
  2696.                                                         (Ptr)&reqType,
  2697.                                                         sizeof(reqType),
  2698.                                                         &actualSize);
  2699.         
  2700.         if (tempErr!=noErr) 
  2701.             reqType = typeChar;
  2702.             
  2703.         if (myErr == noErr) 
  2704.             myErr = GotRequiredParams(theAppleEvent);
  2705.         
  2706.         /* get the data */
  2707.         if (myErr == noErr) 
  2708.             myErr = HandleGetData(&myDirObj, reqType, &myDataDesc);
  2709.             
  2710.         /* evaluate size of data and discard, create desc for size */
  2711.         if (myErr == noErr) 
  2712.             if (myDataDesc.dataHandle) 
  2713.                 {
  2714.                     dataSize = GetHandleSize((Handle)myDataDesc.dataHandle);
  2715.                     DisposHandle((Handle)myDataDesc.dataHandle);
  2716.                     myErr  = AECreateDesc(typeLongInteger,
  2717.                                                                 (Ptr)&dataSize,
  2718.                                                                 sizeof(dataSize),
  2719.                                                                 &myDataDesc);
  2720.                 }
  2721.             
  2722.             
  2723.         /* if they wanted a reply, attach it now */
  2724.         
  2725.         if (myErr==noErr) 
  2726.             if (reply->descriptorType != typeNull) 
  2727.                 myErr = AEPutParamDesc(reply, keyDirectObject, &myDataDesc);
  2728.                 
  2729.         /* discard our copy */
  2730.         
  2731.         if (myDataDesc.dataHandle) 
  2732.             tempErr = AEDisposeDesc(&myDataDesc);
  2733.                 
  2734.         if (myDirObj.dataHandle) 
  2735.             tempErr = AEDisposeDesc(&myDirObj);
  2736.                 
  2737.         return(myErr);
  2738.     }    /* DoGetDataSize */
  2739.  
  2740. /** -----------------------------------------------------------------------
  2741.         Name:             DoNewElement
  2742.         Purpose:        Handles the NewElement AppleEvent. Only Creates windows for
  2743.                     now.
  2744.      -----------------------------------------------------------------------**/
  2745.  
  2746. pascal OSErr DoNewElement(const AppleEvent *theAppleEvent,
  2747.                                                 AppleEvent *reply, 
  2748.                                                 long       handlerRefCon)
  2749. {
  2750. #pragma unused (handlerRefCon)
  2751.  
  2752.     OSErr       myErr;
  2753.     OSErr       ignoreErr;
  2754.     DescType      returnedType;
  2755.     DescType      newElemClass;
  2756.     Size        actSize;
  2757.     AEDesc        wndwObjSpec;
  2758.     DPtr        theDoc;
  2759.     
  2760.     wndwObjSpec.dataHandle = nil;
  2761.         
  2762.     myErr = AEGetParamPtr(theAppleEvent,
  2763.                                                 keyAEObjectClass,
  2764.                                                 typeType,
  2765.                                                 &returnedType,
  2766.                                                 (Ptr)&newElemClass,
  2767.                                                 sizeof(newElemClass),
  2768.                                                 &actSize);
  2769.             
  2770.   /* check for missing required parameters */
  2771.     
  2772.   if (myErr == noErr) 
  2773.         myErr = GotRequiredParams(theAppleEvent);
  2774.   
  2775.   /* got all required params */
  2776.   
  2777.   /* let's make sure container is the null desc */
  2778.   /* and they want a window */
  2779.     
  2780.   if (newElemClass != cWindow) 
  2781.     myErr = errAEWrongDataType;
  2782.   
  2783.   /* let's create a new window */
  2784.     
  2785.     if (myErr == noErr) 
  2786.         theDoc = NewDocument(false);
  2787.   
  2788.     if (myErr==noErr)
  2789.         if (theDoc == nil) 
  2790.             myErr = -1700;
  2791.         else
  2792.             {
  2793.                 ShowWindow(theDoc->theWindow);
  2794.                 theDoc->dirty = false;
  2795.             
  2796.                 myErr = MakeWindowObj(theDoc->theWindow, &wndwObjSpec);
  2797.             }
  2798.       
  2799.     if (myErr == noErr) 
  2800.         if (reply->descriptorType != typeNull) 
  2801.              myErr = AEPutParamDesc(reply,
  2802.                                                             keyDirectObject,
  2803.                                                             &wndwObjSpec);
  2804.             
  2805.     if (wndwObjSpec.dataHandle) 
  2806.         ignoreErr = AEDisposeDesc(&wndwObjSpec);
  2807.         
  2808.   return(myErr);
  2809. }    /* DoNewElement */
  2810.  
  2811. /** -----------------------------------------------------------------------
  2812.         Name:             DoIsThereA
  2813.         Purpose:        Handles the IsThereA AppleEvent.
  2814.      -----------------------------------------------------------------------**/
  2815.  
  2816. pascal OSErr DoIsThereA(const AppleEvent *theAppleEvent,
  2817.                                             AppleEvent       *reply, 
  2818.                                             long             handlerRefCon)
  2819.                                             
  2820. /*
  2821.     Support check of Windows at first
  2822.     
  2823.     What we do :
  2824.         Get Direct Object
  2825.         Check have all required params
  2826.         Coerce into things we support
  2827.         if we get something back
  2828.             check to see it exists and set reply
  2829.         clean up
  2830.         return
  2831. */
  2832.  
  2833.  {
  2834. #pragma unused (handlerRefCon)
  2835.  
  2836.         OSErr         myErr;
  2837.         OSErr         ignoreErr;
  2838.         AEDesc        myDirObject;
  2839.         AEDesc        windDesc;
  2840.         AEDesc        dataDesc;
  2841.         WindowToken   theWindowToken;
  2842.         Size          tokenSize;
  2843.         Boolean       exists;
  2844.  
  2845.         myDirObject.dataHandle = nil;
  2846.         windDesc.dataHandle    = nil;
  2847.         dataDesc.dataHandle    = nil;
  2848.                 
  2849.         myErr = AEGetParamDesc(theAppleEvent,
  2850.                                                      keyDirectObject,
  2851.                                                      typeWildCard,
  2852.                                                      &myDirObject);
  2853.                         
  2854.         /* check for missing required parameters */
  2855.         
  2856.         if (myErr == noErr) 
  2857.             myErr = GotRequiredParams(theAppleEvent);
  2858.         
  2859.         /* got all required params */
  2860.         
  2861.         /* let's make sure they want to check for a window */
  2862.             
  2863.         exists = false;
  2864.         
  2865.         if (myErr == noErr) 
  2866.             if (AECoerceDesc(&myDirObject, typeMyWndw, &windDesc)==noErr) 
  2867.                 if (windDesc.descriptorType!=typeNull) 
  2868.                     {
  2869.                         GetRawDataFromDescriptor(&windDesc,
  2870.                                                                          (Ptr)&theWindowToken,
  2871.                                                                          sizeof(theWindowToken),
  2872.                                                                          &tokenSize);
  2873.                                                                          
  2874.                         exists = (theWindowToken != nil);    
  2875.                     }
  2876.                     
  2877.         if (myErr == noErr) 
  2878.             myErr = AECreateDesc(typeBoolean,
  2879.                                                      (Ptr)&exists,
  2880.                                                      sizeof(exists),
  2881.                                                      &dataDesc);
  2882.     
  2883.             
  2884.         /* 
  2885.             if they wanted a reply, which they surely must, 
  2886.             attach the result to it…
  2887.         */
  2888.             
  2889.         if (myErr == noErr)
  2890.             if (reply->descriptorType != typeNull) 
  2891.                  myErr = AEPutParamDesc(reply,
  2892.                                                                 keyDirectObject,
  2893.                                                                 &dataDesc);
  2894.                 
  2895.         if (dataDesc.dataHandle) 
  2896.             ignoreErr = AEDisposeDesc(&dataDesc);
  2897.             
  2898.         if (myDirObject.dataHandle) 
  2899.             ignoreErr = AEDisposeDesc(&myDirObject);
  2900.             
  2901.         if (windDesc.dataHandle) 
  2902.             ignoreErr = AEDisposeDesc(&windDesc);
  2903.             
  2904.         return(myErr);
  2905.     }    /* DoIsThereA */
  2906.  
  2907. /** -----------------------------------------------------------------------
  2908.         Name:             DoCloseWindow
  2909.         Purpose:        Handles the Close AppleEvent.
  2910.      -----------------------------------------------------------------------**/
  2911.  
  2912. pascal OSErr DoCloseWindow(const AppleEvent *theAppleEvent,
  2913.                                                     AppleEvent       *reply,
  2914.                                                     long             handlerRefCon)
  2915.     { 
  2916. #pragma unused (reply, handlerRefCon)
  2917.  
  2918.         OSErr         myErr;
  2919.         OSErr         tempErr;
  2920.         OSErr                 ignoreErr;
  2921.         AEDesc        myDirObj;
  2922.         AEDesc        newDesc;
  2923.         WindowToken   theWindowToken;
  2924.         Size          tokenSize;
  2925.         DescType      saveOpt;
  2926.         Size          actSize;
  2927.         DescType      returnedType;
  2928.         DPtr          myDPtr;
  2929.  
  2930.         myDirObj.dataHandle = nil;
  2931.         
  2932.         /* pick up the direct object, which is the object (window) to close */
  2933.         
  2934.         myErr = AEGetParamDesc(theAppleEvent,
  2935.                                                      keyDirectObject,
  2936.                                                      typeWildCard,
  2937.                                                      &myDirObj);
  2938.                     
  2939.         /* pick up optional save param, if any */
  2940.         
  2941.         saveOpt = kAEAsk; /* the default */
  2942.         
  2943.         tempErr = AEGetParamPtr(theAppleEvent,
  2944.                                                         keyAESaveOptions,
  2945.                                                         typeEnumerated,
  2946.                                                         &returnedType,
  2947.                                                         (Ptr)&saveOpt,
  2948.                                                         sizeof(saveOpt),
  2949.                                                         &actSize);
  2950.                                                          
  2951.         if (myErr == noErr)
  2952.             myErr = GotRequiredParams(theAppleEvent);
  2953.             
  2954.         /* get the window to close as a window ptr */
  2955.         if (myErr == noErr) 
  2956.             if (AECoerceDesc(&myDirObj, typeMyWndw, &newDesc)==noErr) 
  2957.                 if (newDesc.descriptorType!=typeNull) 
  2958.                     {
  2959.                         GetRawDataFromDescriptor(&newDesc,
  2960.                                                                          (Ptr)&theWindowToken,
  2961.                                                                          sizeof(theWindowToken),
  2962.                                                                          &tokenSize);
  2963.                                                                          
  2964.                         ignoreErr = AEDisposeDesc(&newDesc);
  2965.                         
  2966.                         if (theWindowToken) 
  2967.                             {
  2968.                                 myErr=AESetInteractionAllowed(kAEInteractWithAll); /* Should do this in prefs */
  2969.                                 
  2970.                                 /*
  2971.                                     We do some of the close checks here to avoid
  2972.                                     calling AEInteractWithUser
  2973.                                 */
  2974.                                 myDPtr = DPtrFromWindowPtr(theWindowToken);
  2975.                                 if ((myDPtr->dirty) || (myDPtr->everSaved == false)) 
  2976.                                     if (saveOpt != kAENo) /* Don't flip layers if force no ask */
  2977.                                         myErr = AEInteractWithUser(kAEDefaultTimeout, nil, nil);
  2978.                                     
  2979.                                 if (myErr==noErr) 
  2980.                                     myErr = DoClose(theWindowToken, true, saveOpt);
  2981.                             }
  2982.                         else
  2983.                             myErr =  errAEIllegalIndex;
  2984.                     }
  2985.                         
  2986.         if (myDirObj.dataHandle) 
  2987.             tempErr = AEDisposeDesc(&myDirObj);
  2988.                 
  2989.         return(myErr);
  2990.     }    /* DoCloseWindow */
  2991.  
  2992. /** -----------------------------------------------------------------------
  2993.         Name:             IndexFromWindowPtr
  2994.         Purpose:        calculates index of WindowPtr.
  2995.                     1 == frontmost window
  2996.                                 0 == no window
  2997.                                 n == n-1 behind first window
  2998.      -----------------------------------------------------------------------**/
  2999.  
  3000. pascal short IndexFromWindowPtr(WindowPtr theWindowPtr)
  3001.  {
  3002.          short     index;
  3003.         WindowPtr checkWin;
  3004.         
  3005.         index = 0;
  3006.         checkWin = (WindowPtr)*((Handle)WindowList);
  3007.          
  3008.         //    iterate through windows - we use WindowList to see all windows visible or not
  3009.         
  3010.         while (checkWin)
  3011.             {
  3012.                 index++;
  3013.                 
  3014.                 if (checkWin==theWindowPtr)
  3015.                     return(index);
  3016.                     
  3017.               checkWin = (WindowPtr)((WindowPeek)checkWin)->nextWindow;
  3018.             }
  3019.             
  3020.         return(0);
  3021.  }
  3022.  
  3023. /** -----------------------------------------------------------------------
  3024.         Name:             MoveWindowRelative
  3025.         Purpose:        Moves one window relative to another.
  3026.      -----------------------------------------------------------------------**/
  3027.  
  3028. pascal OSErr MoveWindowRelative(WindowToken theWindowToken,
  3029.                                 WindowToken theRelWindowToken,
  3030.                                                               DescType    theRelPosn)
  3031.     {
  3032.         short win1Index;
  3033.         short win2Index;
  3034.         OSErr myErr = noErr;
  3035.         
  3036.         win1Index = IndexFromWindowPtr(theWindowToken);
  3037.         win2Index = IndexFromWindowPtr(theRelWindowToken);
  3038.         
  3039.         if (theRelPosn==kAEBefore)
  3040.             if (win2Index==1)
  3041.                 {
  3042.                     SelectWindow(theWindowToken); // special case - make frontmost window
  3043.                     return(myErr);
  3044.                 }
  3045.             else
  3046.                 { // in front of 3 == behind 2 so…
  3047.                     win2Index--;
  3048.                 }
  3049.         
  3050.         if (win2Index!=win1Index+1)
  3051.             {
  3052.                 SendBehind(theWindowToken,theRelWindowToken);
  3053.                 
  3054.                 if (win1Index > win2Index + 1)
  3055.                      // Fix up visRgn as per Inside Mac I-286.
  3056.                     {    
  3057.                         PaintOne((WindowPeek)theWindowToken,
  3058.                                          ((WindowPeek)theWindowToken)->strucRgn);
  3059.                         CalcVis((WindowPeek)theWindowToken);
  3060.                     }
  3061.             }
  3062.         return(myErr);
  3063.     }
  3064.  
  3065. /** -----------------------------------------------------------------------
  3066.         Name:             DoMoveWindow
  3067.         Purpose:        Handles the Move AppleEvent for windows.
  3068.      -----------------------------------------------------------------------**/
  3069.  
  3070. pascal OSErr DoMoveWindow(const AppleEvent *theAppleEvent,
  3071.                                                    AppleEvent       *reply,
  3072.                                                    long             handlerRefCon)
  3073.     { 
  3074. #pragma unused (reply, handlerRefCon)
  3075.  
  3076.         OSErr         myErr;
  3077.         OSErr                 ignoreErr;
  3078.         AEDesc        whereToPutIt;
  3079.         AEDesc        theLocationRec;
  3080.         DescType      theRelPosn;
  3081.         WindowToken   theWindowToken;
  3082.         WindowToken   theRefWindowToken;
  3083.         Size          actSize;
  3084.         DescType      returnedType;
  3085.  
  3086.         whereToPutIt.dataHandle   = nil;
  3087.         theLocationRec.dataHandle = nil;
  3088.         
  3089.         /* pick up the direct object, which is the object (window) to move */
  3090.         
  3091.         myErr = AEGetParamPtr(theAppleEvent,
  3092.                                                     keyDirectObject,
  3093.                                                     typeMyWndw,
  3094.                                                     &returnedType,
  3095.                                                     (Ptr)&theWindowToken,
  3096.                                                     sizeof(theWindowToken),
  3097.                                                     &actSize);
  3098.                     
  3099.         /* pick up where to information */
  3100.         
  3101.         if (myErr==noErr)
  3102.             myErr = AEGetParamDesc(theAppleEvent,
  3103.                                                          keyAEInsertHere,
  3104.                                                          typeInsertionLoc,
  3105.                                                          &whereToPutIt);
  3106.                                                          
  3107.         if (myErr==noErr)
  3108.             {
  3109.                 myErr = AECoerceDesc(&whereToPutIt, typeAERecord, &theLocationRec);
  3110.                                 
  3111.                 if (myErr==noErr)
  3112.                     myErr = AEGetKeyPtr(&theLocationRec,
  3113.                                                             keyAEObject,
  3114.                                                             typeMyWndw,
  3115.                                                             &returnedType,
  3116.                                                             (Ptr)&theRefWindowToken,
  3117.                                                             sizeof(theRefWindowToken),
  3118.                                                             &actSize);
  3119.                 if (myErr==noErr)
  3120.                     myErr = AEGetKeyPtr(&theLocationRec,
  3121.                                                             keyAEPosition,
  3122.                                                             typeEnumerated,
  3123.                                                             &returnedType,
  3124.                                                             (Ptr)&theRelPosn,
  3125.                                                             sizeof(theRelPosn),
  3126.                                                             &actSize);
  3127.                                                             
  3128.                 if (theLocationRec.dataHandle)
  3129.                     ignoreErr = AEDisposeDesc(&theLocationRec);
  3130.             }
  3131.                                          
  3132.         if (myErr == noErr)
  3133.             myErr = GotRequiredParams(theAppleEvent);
  3134.  
  3135.         if (theRelPosn==kAEBefore ||
  3136.             theRelPosn==kAEAfter)
  3137.             MoveWindowRelative(theWindowToken, theRefWindowToken, theRelPosn);
  3138.         else
  3139.             myErr = errAEEventNotHandled;
  3140.             
  3141.         if (whereToPutIt.dataHandle)
  3142.             ignoreErr = AEDisposeDesc(&whereToPutIt);
  3143.                     
  3144.         // Now place one window relative to the other
  3145.         
  3146.         return(myErr);
  3147.     }    /* DoMoveWindow */
  3148.  
  3149.  
  3150. /** -----------------------------------------------------------------------
  3151.         Name:             DoSaveWindow
  3152.         Purpose:        Handles the Save AppleEvent.
  3153.      -----------------------------------------------------------------------**/
  3154.  
  3155. pascal OSErr DoSaveWindow(const AppleEvent *theAppleEvent,
  3156.                                                  AppleEvent       *reply,
  3157.                                                  long             handlerRefCon)
  3158.     { 
  3159. #pragma unused (reply, handlerRefCon)
  3160.     
  3161.         OSErr         myErr;
  3162.         OSErr         tempErr;
  3163.         OSErr         ignoreErr;
  3164.         AEDesc        myDirObj;
  3165.         AEDesc        newDesc;
  3166.         WindowToken   theWindowToken;
  3167.         Size          tokenSize;
  3168.         Size          actSize;
  3169.         DescType      returnedType;
  3170.         DPtr          theDoc;
  3171.         FSSpec        destFSSpec;
  3172.         
  3173.         myDirObj.dataHandle = nil;
  3174.         
  3175.         /* pick up the direct object, which is the window to save */
  3176.         
  3177.         myErr = AEGetParamDesc(theAppleEvent,
  3178.                                                      keyDirectObject,
  3179.                                                      typeWildCard,
  3180.                                                      &myDirObj);
  3181.                                                      
  3182.         /* pick up optional destination param, if any */
  3183.     
  3184.         tempErr = AEGetParamPtr(theAppleEvent,
  3185.                                                         keyAEDestination,
  3186.                                                       typeFSS,
  3187.                                                         &returnedType,
  3188.                                                         (Ptr)&destFSSpec,
  3189.                                                         sizeof(destFSSpec),
  3190.                                                         &actSize);
  3191.     
  3192.         if (myErr == noErr) 
  3193.             myErr = GotRequiredParams(theAppleEvent);
  3194.             
  3195.         /* get the data */
  3196.     
  3197.         myErr = AECoerceDesc(&myDirObj, typeMyWndw, &newDesc);
  3198.         
  3199.         if (myErr == noErr)
  3200.             if (newDesc.descriptorType!=typeNull) 
  3201.                 {
  3202.                     GetRawDataFromDescriptor(&newDesc,
  3203.                                                                      (Ptr)&theWindowToken,
  3204.                                                                      sizeof(theWindowToken),
  3205.                                                                      &tokenSize);
  3206.                                                                      
  3207.                     ignoreErr = AEDisposeDesc(&newDesc);
  3208.                                                                      
  3209.                     if (theWindowToken) 
  3210.                         {                            
  3211.                             theDoc = DPtrFromWindowPtr(theWindowToken);
  3212.                             
  3213.                             if (theDoc->everSaved == false) 
  3214.                                 if (tempErr != noErr) 
  3215.                                      /* We had no supplied destination and no default either */
  3216.                                     myErr = kAEGenericErr;
  3217.                             
  3218.                             if (myErr==noErr)
  3219.                                 if (tempErr==noErr)
  3220.                                     { /* we were told where */
  3221.                                         myErr = DoSave(theDoc, destFSSpec); 
  3222.                                         
  3223.                                         if (myErr==noErr)
  3224.                                             AssocAllSections(theDoc);
  3225.                                     }
  3226.                                 else
  3227.                                     myErr = SaveUsingTemp(theDoc);
  3228.                         }
  3229.                     else
  3230.                         myErr =  errAEIllegalIndex;
  3231.                 }
  3232.                 
  3233.         if (myDirObj.dataHandle) 
  3234.             tempErr = AEDisposeDesc(&myDirObj);
  3235.     
  3236.         return(myErr);
  3237.                     
  3238.     }    /* DoSaveWindow */
  3239.  
  3240. /** -----------------------------------------------------------------------
  3241.         Name:             DoRevertWindow
  3242.         Purpose:        Handles the Revert AppleEvent.
  3243.      -----------------------------------------------------------------------**/
  3244.  
  3245. pascal OSErr DoRevertWindow(const AppleEvent *theAppleEvent,
  3246.                                                      AppleEvent       *reply,
  3247.                                                      long             handlerRefCon)
  3248. #pragma unused (reply, handlerRefCon)
  3249.  
  3250.     OSErr          myErr;
  3251.     OSErr          ignoreErr;
  3252.     AEDesc         myDirObj;
  3253.     AEDesc         newDesc;
  3254.     WindowToken    theWindowToken;
  3255.     Size           tokenSize;
  3256.     DPtr           theDoc;
  3257.     
  3258.     myDirObj.dataHandle = nil;
  3259.     
  3260.   /* pick up the direct object, which is the window to save */
  3261.     
  3262.   myErr = AEGetParamDesc(theAppleEvent,
  3263.                                                  keyDirectObject,
  3264.                                                  typeWildCard,
  3265.                                                  &myDirObj);
  3266.  
  3267.     if (myErr == noErr)
  3268.       myErr = GotRequiredParams(theAppleEvent);
  3269.         
  3270.   /* get the window to revert from the direct object */
  3271.     
  3272.     myErr = AECoerceDesc(&myDirObj, typeMyWndw, &newDesc);
  3273.     
  3274.   if (myErr == noErr) 
  3275.         if (newDesc.descriptorType!=typeNull) 
  3276.             {
  3277.                 GetRawDataFromDescriptor(&newDesc,
  3278.                                                                  (Ptr)&theWindowToken,
  3279.                                                                  sizeof(theWindowToken),
  3280.                                                                  &tokenSize);
  3281.                                                                  
  3282.                 ignoreErr = AEDisposeDesc(&newDesc);
  3283.                                                                  
  3284.                 if (theWindowToken) 
  3285.                     {    
  3286.                         theDoc = DPtrFromWindowPtr(theWindowToken);
  3287.                         
  3288.                         HidePen();
  3289.                         TESetSelect(0, (*(theDoc->theText))->teLength, theDoc->theText);
  3290.                         ShowPen();
  3291.                         TEDelete(theDoc->theText);
  3292.         
  3293.                         if (theDoc->everSaved) 
  3294.                             {
  3295.                                 myErr = GetFileContents(theDoc->theFSSpec, theDoc);
  3296.                                 if (myErr == noErr) 
  3297.                                     {
  3298.                                         ResizeWindow(theDoc);
  3299.                                         theDoc->dirty = false;
  3300.                                     }
  3301.                             }
  3302.         
  3303.                         ShowWindow(theDoc->theWindow); /* <<< Visible already??? */
  3304.                         DoUpdate(theDoc);
  3305.                     }
  3306.                 else
  3307.                     myErr =  errAEIllegalIndex;
  3308.             }
  3309.                 
  3310.     if (myDirObj.dataHandle) 
  3311.         ignoreErr = AEDisposeDesc(&myDirObj);
  3312.         
  3313.   return(myErr);
  3314. }    /* DoRevertWindow */
  3315.  
  3316. /**-----------------------------------------------------------------------
  3317.         Name:             DoPrintDocuments
  3318.         Purpose:        Print a list of documents (or windows).
  3319. -----------------------------------------------------------------------**/
  3320. pascal OSErr DoPrintDocuments(const AppleEvent *message,
  3321.                               AppleEvent       *reply,
  3322.                                                             long refcon)
  3323. {
  3324. #pragma unused (reply, refcon)
  3325.         long          index;
  3326.         long          itemsInList;
  3327.         AEKeyword     keywd;
  3328.         OSErr         err;
  3329.         AEDescList    docList;
  3330.         Size          actSize;
  3331.         DescType      typeCode;
  3332.         FSSpec        theFSSpec;
  3333.         WindowToken   theWindowToken;
  3334.         OSErr         forgetErr;
  3335.         Boolean       talkToUser;
  3336.             
  3337.         err = AEGetParamDesc(message,
  3338.                                                  keyDirectObject,
  3339.                                                  typeAEList,
  3340.                                                  &docList);
  3341.                                                  
  3342.         err = AECountItems(&docList, &itemsInList);
  3343.             
  3344.         for (index = 1; index<=itemsInList; index++)
  3345.             if (err == noErr) 
  3346.                 {
  3347.                     forgetErr = AEGetNthPtr( &docList, index, typeFSS, &keywd,
  3348.                                                                      &typeCode, (Ptr)&theFSSpec, sizeof(theFSSpec), &actSize);
  3349.                                                                         
  3350.                     if (forgetErr == noErr) 
  3351.                         {
  3352.                             if (err == noErr) 
  3353.                                 err = IssueAEOpenDoc(theFSSpec);
  3354.                                 
  3355.                             if (err == noErr) 
  3356.                                 IssuePrintWindow(FrontWindow());
  3357.                                 
  3358.                             if (err == noErr) 
  3359.                                 IssueCloseCommand(FrontWindow());
  3360.                         }
  3361.                     else
  3362.                         { /* wasn't a file - was it a window ? */
  3363.                             err = AEGetNthPtr(&docList,
  3364.                                               index,
  3365.                                               typeMyWndw,
  3366.                                               &keywd,
  3367.                                                                 &typeCode,
  3368.                                                                 (Ptr)&theWindowToken,
  3369.                                                                 sizeof(WindowToken),
  3370.                                                                 &actSize);
  3371.                                                                     
  3372.                             talkToUser = (AEInteractWithUser(kAEDefaultTimeout, nil, nil) == noErr);
  3373.                             
  3374.                             if (err == noErr) 
  3375.                                 PrintWindow(DPtrFromWindowPtr(theWindowToken), talkToUser);
  3376.                         }
  3377.                 }
  3378.         
  3379.         if (docList.dataHandle)
  3380.             forgetErr = AEDisposeDesc(&docList);
  3381.             
  3382.         return(err);
  3383.     } /* DoPrintDocuments */
  3384.  
  3385. /**-----------------------------------------------------------------------
  3386.         Name:             HandleCreatePub
  3387.         Purpose:        Create a publisher.
  3388. -----------------------------------------------------------------------**/
  3389. pascal OSErr HandleCreatePub(const AppleEvent *theAppleEvent,
  3390.                              AppleEvent       *reply,
  3391.                                                          long refcon)
  3392.     {
  3393. #pragma unused (reply, refcon)
  3394.  
  3395.         OSErr       myErr;
  3396.         FSSpec      theFSSpec;
  3397.         OSErr       forgetErr;
  3398.         OSErr       forget2Err;
  3399.         AEDesc      myDirObj;
  3400.         AEDesc      myFileLoc;
  3401.         TextToken   theTextToken;
  3402.         DPtr        theDoc;
  3403.         AEDesc      newDesc;
  3404.         long        tokenSize;
  3405.         Boolean     haveFSSpec;
  3406.         
  3407.         myErr = noErr;
  3408.         
  3409.         forgetErr  = AEGetParamDesc(theAppleEvent,
  3410.                                                                 keyDirectObject,
  3411.                                                                 typeWildCard,
  3412.                                                                 &myDirObj);
  3413.         
  3414.         forget2Err = AEGetParamDesc(theAppleEvent,
  3415.                                                                 keyAEEditionFileLoc,
  3416.                                                                 typeWildCard,
  3417.                                                                 &myFileLoc);
  3418.                                                                  
  3419.         if (myErr==noErr)
  3420.             myErr = GotRequiredParams(theAppleEvent);
  3421.             
  3422.         if (forgetErr==noErr)  /* Set the selection to the supplied object - if any */
  3423.             {
  3424.                 forgetErr = AECoerceDesc(&myDirObj, typeMyText, &newDesc);
  3425.                 if (newDesc.descriptorType!=typeNull) 
  3426.                     {
  3427.                         GetRawDataFromDescriptor(&newDesc,
  3428.                                                                          (Ptr)&theTextToken,
  3429.                                                                          sizeof(theTextToken),
  3430.                                                                          &tokenSize);
  3431.                                                                          
  3432.                         theDoc = DPtrFromWindowPtr(theTextToken.tokenWindow);
  3433.                         
  3434.                         TESetSelect(theTextToken.tokenOffset-1,
  3435.                                                 theTextToken.tokenOffset+
  3436.                                                                     theTextToken.tokenLength-1,
  3437.                                                 theDoc->theText);
  3438.                                                 
  3439.                         forgetErr = AEDisposeDesc(&newDesc);
  3440.                     }
  3441.             }
  3442.         else
  3443.             theDoc = DPtrFromWindowPtr(FrontWindow());
  3444.             
  3445.         if (theDoc==nil) 
  3446.             {
  3447.                 /* Should clean up and exit with error */
  3448.             }
  3449.             
  3450.         haveFSSpec = false;
  3451.         
  3452.         if (forget2Err==noErr)  /* Get the Edition Container File */
  3453.             {
  3454.                 forget2Err = AECoerceDesc(&myDirObj,typeFSS,&newDesc);
  3455.                 if (newDesc.descriptorType!=typeNull) 
  3456.                     {
  3457.                         GetRawDataFromDescriptor(&newDesc,
  3458.                                                                          (Ptr)&theFSSpec,
  3459.                                                                          sizeof(theFSSpec),
  3460.                                                                          &tokenSize);
  3461.                         forget2Err = AEDisposeDesc(&newDesc);
  3462.                         haveFSSpec = true;
  3463.                     }
  3464.             }
  3465.             
  3466.         if (haveFSSpec==false) 
  3467.             myErr = GetEditionContainer(theDoc, &theFSSpec);
  3468.     
  3469.         if (myErr == noErr) 
  3470.             myErr = PublishText(theDoc, &theFSSpec);
  3471.             
  3472.         if (myDirObj.dataHandle)
  3473.             forgetErr = AEDisposeDesc(&myDirObj);
  3474.         
  3475.         if (myFileLoc.dataHandle) 
  3476.             forgetErr = AEDisposeDesc(&myFileLoc);
  3477.         
  3478.         return(myErr);
  3479.         
  3480.     } /* HandleCreatePub */
  3481.  
  3482.  
  3483. pascal OSErr MyCountProc(    DescType desiredType,
  3484.                                                     DescType containerClass,
  3485.                                                     const AEDesc *container,
  3486.                                                     long *result);
  3487.                                             
  3488. /** -----------------------------------------------------------------------
  3489.         Name:       HandleNumberOfElements
  3490.         Purpose:        Handles the Number Of Elements AppleEvent.
  3491.      -----------------------------------------------------------------------**/
  3492.  
  3493. pascal OSErr HandleNumberOfElements(const AppleEvent *theAppleEvent,
  3494.                                                                     AppleEvent *reply,
  3495.                                                                     long       handlerRefCon)
  3496.   {
  3497. #pragma unused (handlerRefCon)
  3498.  
  3499.       OSErr    myErr;
  3500.       OSErr    forgetErr;
  3501.         AEDesc   myDirObj;
  3502.         DescType myClass;
  3503.         long     myCount;
  3504.         DescType returnedType;
  3505.         Size     actSize;
  3506.         
  3507.         myErr                 = errAEEventNotHandled;
  3508.         myDirObj.dataHandle = nil;
  3509.         
  3510.         /* pick up direct object, which is the container in which things are to be counted */
  3511.         
  3512.         myErr = AEGetParamDesc(theAppleEvent,
  3513.                                                      keyDirectObject,
  3514.                                                      typeWildCard,
  3515.                                                      &myDirObj);
  3516.             
  3517.         /* now the class of objects to be counted */
  3518.         
  3519.         myErr = AEGetParamPtr( theAppleEvent,
  3520.                                                      keyAEObjectClass,
  3521.                                                      typeType,
  3522.                                                      &returnedType,
  3523.                                                      (Ptr)&myClass,
  3524.                                                      sizeof(myClass),
  3525.                                                      &actSize);
  3526.             
  3527.         /* missing any parameters? */
  3528.         
  3529.         myErr = GotRequiredParams(theAppleEvent);
  3530.         
  3531.         /* now count */
  3532.     
  3533.         if (myErr == noErr) 
  3534.             myErr = MyCountProc(myClass,myDirObj.descriptorType, &myDirObj,&myCount);
  3535.         
  3536.         /* add result to reply */
  3537.     
  3538.         if (myErr == noErr) 
  3539.             if (reply->descriptorType != typeNull) 
  3540.                  myErr  = AEPutParamPtr(reply,
  3541.                                                                 keyDirectObject,
  3542.                                                                 typeLongInteger,
  3543.                                                                 (Ptr)&myCount,
  3544.                                                                 sizeof(myCount));
  3545.         if (myErr == noErr)       
  3546.             forgetErr  = AEDisposeDesc(&myDirObj);
  3547.         
  3548.         return(myErr);
  3549.         
  3550.     }    /* HandleNumberOfElements */
  3551.  
  3552. /** -----------------------------------------------------------------------
  3553.         Name:             HandleShowSelection
  3554.         Purpose:        Handles the Make Selection Visible AppleEvent.
  3555.      -----------------------------------------------------------------------**/
  3556.  
  3557. pascal OSErr HandleShowSelection(const AppleEvent *theAppleEvent,
  3558.                                                              AppleEvent       *reply,
  3559.                                                              long             handlerRefCon)
  3560.   {
  3561. #pragma unused (reply,handlerRefCon)
  3562.     
  3563.         OSErr       myErr;
  3564.         OSErr       ignoreErr;
  3565.         AEDesc      myDirObj;
  3566.         AEDesc      newDesc;
  3567.         AEDesc      tokenDesc;
  3568.         Size        actSize;
  3569.         WindowToken theWindowToken;
  3570.         DPtr        theDocument;
  3571.         TEHandle    theHTE;
  3572.         
  3573.         myErr      = errAEEventNotHandled;
  3574.         myDirObj.dataHandle  = nil;
  3575.         tokenDesc.dataHandle = nil;
  3576.         
  3577.         /*
  3578.             pick up direct object, i.e. the window in which to show the selection
  3579.         */
  3580.             
  3581.         myErr  = AEGetParamDesc(theAppleEvent,
  3582.                                                         keyDirectObject,
  3583.                                                         typeWildCard,
  3584.                                                         &myDirObj);
  3585.                 
  3586.         /*
  3587.             missing any parameters?
  3588.         */
  3589.         
  3590.         myErr = GotRequiredParams(theAppleEvent);
  3591.         
  3592.         /*
  3593.             convert object to WindowToken which we understand
  3594.         */
  3595.         myErr = AEResolve(&myDirObj, kAEIDoMinimum, &tokenDesc);
  3596.         
  3597.         if (myErr == noErr)
  3598.             if (tokenDesc.descriptorType==typeMyWndw)
  3599.                 {
  3600.                     if (AECoerceDesc(&myDirObj, typeMyWndw, &newDesc) == noErr) 
  3601.                         {
  3602.                             GetRawDataFromDescriptor(&newDesc,
  3603.                                                                              (Ptr)&theWindowToken,
  3604.                                                                              sizeof(theWindowToken),
  3605.                                                                              &actSize);
  3606.         
  3607.                             ignoreErr = AEDisposeDesc(&newDesc);
  3608.                             
  3609.                             if (myErr==noErr) 
  3610.                                 if (theWindowToken)                                                          
  3611.                                     ShowSelect(DPtrFromWindowPtr(theWindowToken));
  3612.                                 else
  3613.                                     myErr = errAEIllegalIndex;
  3614.                         }
  3615.                 }
  3616.             else
  3617.                 if (tokenDesc.descriptorType==typeMyText)
  3618.                     {
  3619.                         myErr = SetSelectionOfAppleEventObject(keyDirectObject,
  3620.                                                                                           theAppleEvent,
  3621.                                                                                            &theDocument,
  3622.                                                                                           &theHTE);
  3623.                         if (theDocument)
  3624.                           ShowSelect(theDocument);
  3625.                         else
  3626.                             myErr = errAEIllegalIndex;
  3627.                     }
  3628.                 else
  3629.                     myErr = errAEEventNotHandled;
  3630.                     
  3631.         if (myDirObj.dataHandle)
  3632.             ignoreErr = AEDisposeDesc(&myDirObj);
  3633.         
  3634.         if (tokenDesc.dataHandle)
  3635.             ignoreErr = AEDisposeDesc(&tokenDesc);
  3636.             
  3637.         return(myErr);
  3638.         
  3639.     }    /* HandleShowSelection */
  3640.  
  3641. pascal OSErr HandleStartRecording(const AppleEvent *theAppleEvent,
  3642.                                                               AppleEvent *reply,
  3643.                                                               long       handlerRefCon)        
  3644.     {
  3645. #pragma unused (reply,handlerRefCon)
  3646.  
  3647.         OSErr myErr;
  3648.  
  3649.       gBigBrother++;
  3650.     
  3651.         myErr = GotRequiredParams(theAppleEvent);
  3652.  
  3653.         return(myErr);
  3654.         
  3655.     }    /* HandleStartRecording */
  3656.  
  3657. pascal OSErr HandleStopRecording(const AppleEvent *theAppleEvent,
  3658.                                                              AppleEvent *reply,
  3659.                                                                  long handlerRefCon)        
  3660.     {
  3661. #pragma unused (theAppleEvent,reply,handlerRefCon)
  3662.     
  3663.         gBigBrother--;
  3664.         return(noErr);
  3665.     }    /* HandleStopRecording */
  3666.  
  3667.  
  3668. #pragma segment AECommandIssuers
  3669.  
  3670. /*******************************************************************************/
  3671. /* 
  3672.         Start of section involved in building and sending AppleEvent Objects as/with
  3673.         commands
  3674.  */
  3675.  
  3676. /*
  3677.     Make an AEDesc that describes the selection in the window and text edit
  3678.     record supplied
  3679. */
  3680.  
  3681. pascal OSErr MakeWindowObj(WindowPtr theWindow,
  3682.                                                    AEDesc    *dMyDoc)
  3683.     {
  3684.             OSErr    myErr;
  3685.             AEDesc   dNull;
  3686.             AEDesc   dDocIndex;
  3687.             short    winIndex;
  3688.             
  3689.             // AEDesc   dDocName;
  3690.             // Str255   windowName;
  3691.             
  3692.             //  Changed from name to index for better playback
  3693.             //  Needed as new windows now have incremental names
  3694.             //    GetWTitle(theWindow, windowName);
  3695.             //  myErr = AECreateDesc(typeChar,(Ptr)&windowName[1], windowName[0], &dDocName);
  3696.             //  CreateObjSpecifier was formName too…
  3697.             
  3698.             myErr = noErr;
  3699.             
  3700.             winIndex = IndexFromWindowPtr(theWindow);
  3701.             
  3702.             if (winIndex==0)
  3703.                 myErr = errAEIllegalIndex;
  3704.             
  3705.             if (myErr==noErr)
  3706.                 myErr = CreateOffsetDescriptor(winIndex, &dDocIndex);
  3707.             
  3708.             if (myErr==noErr) 
  3709.                 myErr = AECreateDesc(typeNull, nil , 0, &dNull);
  3710.             
  3711.             if (myErr==noErr) 
  3712.                 myErr = CreateObjSpecifier(cWindow, &dNull, formAbsolutePosition, &dDocIndex, true, dMyDoc);
  3713.             
  3714.             return(myErr);
  3715.             
  3716.     } /*MakeWindowObj*/
  3717.     
  3718. pascal OSErr MakeTextObj(WindowPtr theWindow,
  3719.                                                  short     selStart,
  3720.                                                  short     selEnd,
  3721.                                                  AEDesc    *selTextObj)
  3722.     {
  3723.         OSErr    myErr;
  3724.         OSErr    ignoreErr;
  3725.         AEDesc   dMyDoc;
  3726.         AEDesc   startOfs;
  3727.         AEDesc   endOfs;
  3728.         AEDesc   startObj;
  3729.         AEDesc   endObj;
  3730.         AEDesc   rangeDesc;
  3731.         long     startChar;
  3732.         long     endChar;
  3733.         Boolean  spotFlag;
  3734.             
  3735.         myErr = noErr;
  3736.         
  3737.         if (theWindow==nil) 
  3738.             return(noErr);
  3739.             
  3740.         selTextObj->dataHandle = nil;
  3741.         dMyDoc.dataHandle      = nil;
  3742.         startObj.dataHandle    = nil;
  3743.         endObj.dataHandle      = nil;
  3744.         
  3745.         /* 
  3746.             make the window object 
  3747.         */
  3748.         
  3749.         myErr = MakeWindowObj(theWindow, &dMyDoc);
  3750.             
  3751.         if (myErr==noErr)
  3752.             {
  3753.                 /* get the start and end of selection */
  3754.                 
  3755.                 startChar = selStart+1;    /* start counting obj's from 1, not 0 */
  3756.                 endChar   = selEnd;
  3757.                 spotFlag  = (selStart == selEnd);
  3758.                     
  3759.                 myErr = CreateOffsetDescriptor(startChar, &startOfs);
  3760.                             
  3761.                 if (myErr==noErr)
  3762.                     if (spotFlag)
  3763.                         myErr = CreateObjSpecifier(cSpot,
  3764.                                                                              &dMyDoc,
  3765.                                                                              formAbsolutePosition, 
  3766.                                                                              &startOfs, 
  3767.                                                                              true, 
  3768.                                                                              selTextObj);
  3769.                     else
  3770.                         {
  3771.                             /* not a spot - must represent as range */
  3772.                             /* make obj for start char */
  3773.                             
  3774.                             myErr = CreateObjSpecifier(cChar,
  3775.                                                        &dMyDoc,
  3776.                                                                                  formAbsolutePosition,
  3777.                                                                                  &startOfs,
  3778.                                                                                  false,
  3779.                                                                                  &startObj);
  3780.                             
  3781.                             if (myErr==noErr) 
  3782.                                 myErr = CreateOffsetDescriptor(endChar, &endOfs);
  3783.                             
  3784.                             if (myErr==noErr) 
  3785.                                 myErr = CreateObjSpecifier(cChar,
  3786.                                                                                      &dMyDoc,
  3787.                                                                                      formAbsolutePosition,
  3788.                                                                                      &endOfs,
  3789.                                                                                      false,
  3790.                                                                                      &endObj);
  3791.                             
  3792.                             if (myErr==noErr) 
  3793.                                 myErr = CreateRangeDescriptor(&startObj,
  3794.                                                                                             &endObj,
  3795.                                                                                             false,
  3796.                                                                                             &rangeDesc);
  3797.                             
  3798.                             if (myErr==noErr) 
  3799.                                 myErr = CreateObjSpecifier(cChar,
  3800.                                                                                      &dMyDoc,
  3801.                                                                                      formRange,
  3802.                                                                                      &rangeDesc,
  3803.                                                                                      true,
  3804.                                                                                      selTextObj);
  3805.                                                                                      
  3806.                             if (startObj.dataHandle)
  3807.                               ignoreErr = AEDisposeDesc(&startObj);
  3808.                                 
  3809.                             if (startOfs.dataHandle)
  3810.                               ignoreErr = AEDisposeDesc(&startOfs);
  3811.                                 
  3812.                             if (endObj.dataHandle)
  3813.                               ignoreErr = AEDisposeDesc(&endObj);
  3814.                                 
  3815.                             if (endOfs.dataHandle)
  3816.                               ignoreErr = AEDisposeDesc(&endOfs);
  3817.                         }
  3818.             }
  3819.             
  3820.         return(myErr);
  3821.     }
  3822.     
  3823. pascal OSErr MakeSelectedTextObj(WindowPtr theWindow,
  3824.                                                                  TEHandle  theTextEditHandle,
  3825.                                                                  AEDesc    *selTextObj)
  3826.     {
  3827.         return( MakeTextObj(theWindow,
  3828.                                                 (**theTextEditHandle).selStart,
  3829.                                                 (**theTextEditHandle).selEnd,
  3830.                                               selTextObj));
  3831.                                                 
  3832.     }    /* MakeSelectedTextObj */
  3833.  
  3834.  
  3835. /** -----------------------------------------------------------------------
  3836.         Name:             MakeMenuObj
  3837.         Purpose:        Creates a typeObjSpecifier for a named menu.
  3838.      -----------------------------------------------------------------------**/
  3839.  
  3840. pascal OSErr MakeMenuObj(Str255 theName, AEDesc *resultingObj)
  3841.     {
  3842.         AEDesc newDesc;
  3843.         AEDesc dNull;
  3844.         OSErr  theErr;
  3845.         
  3846.         theErr  = AECreateDesc(typeChar,
  3847.                                                      (Ptr)&theName[1],
  3848.                                                      theName[0],
  3849.                                                      &newDesc);
  3850.         if (theErr==noErr)
  3851.             {
  3852.                 theErr = AECreateDesc(typeNull, nil , 0, &dNull);
  3853.                 
  3854.                 theErr = CreateObjSpecifier(cMenu,
  3855.                                                                         &dNull,
  3856.                                                                         formName,
  3857.                                                                         &newDesc,
  3858.                                                                         true,
  3859.                                                                         resultingObj);
  3860.             }
  3861.             
  3862.         return(theErr);
  3863.         
  3864.     } /* MakeMenuObj */
  3865.     
  3866. /** -----------------------------------------------------------------------
  3867.         Name:             MakeMenuItemObj
  3868.         Purpose:        Creates a typeObjSpecifier for a named menu.
  3869.      -----------------------------------------------------------------------**/
  3870.  
  3871. pascal OSErr MakeMenuItemObj(Str255 theName, short theItem, AEDesc *resultingObj)
  3872.     {
  3873.         AEDesc menuDesc;
  3874.         AEDesc dataDesc;
  3875.         
  3876.         OSErr  theErr;
  3877.         
  3878.         theErr  = MakeMenuObj(theName, &menuDesc);
  3879.         
  3880.         if (theErr==noErr)
  3881.             {
  3882.                 theErr = CreateOffsetDescriptor(theItem, &dataDesc);
  3883.                 
  3884.                 theErr = CreateObjSpecifier(cMenu,
  3885.                                                                         &menuDesc,
  3886.                                                                         formAbsolutePosition,
  3887.                                                                         &dataDesc,
  3888.                                                                         true,
  3889.                                                                         resultingObj);
  3890.             }
  3891.             
  3892.         return(theErr);
  3893.     } /* MakeMenuItemObj */
  3894.     
  3895. pascal OSErr MakeClassObj(DescType theClass, AEDesc *myClassObj)
  3896.     {  
  3897.         return(AECreateDesc(typeType,
  3898.                                                      (Ptr)&theClass,
  3899.                                                      sizeof(DescType),
  3900.                                                      myClassObj));
  3901.     } /* MakeClassObj */
  3902.     
  3903. enum editCommandType {
  3904. editCutCommand   = 1,
  3905. editCopyCommand  = 2,
  3906. editPasteCommand = 3,
  3907. editClearCommand = 4
  3908. };
  3909.  
  3910. typedef enum editCommandType editCommandType;
  3911.  
  3912. pascal void DoEditCommand(DPtr theDocument,editCommandType whatCommand)
  3913.     {
  3914.       OSErr         err;
  3915.       OSErr         forgetErr;
  3916.         AEAddressDesc ourAddress;
  3917.         AppleEvent    editCommandEvent;
  3918.         AppleEvent    ignoreReply;
  3919.         AEDesc        ourTextSelObj;
  3920.         AEEventID     theEventID;
  3921.         AEEventClass  theEventClass;
  3922.  
  3923.         /*
  3924.                 Initialise
  3925.         */
  3926.  
  3927.         ourAddress.dataHandle             = nil;
  3928.         ourTextSelObj.dataHandle         = nil;
  3929.         editCommandEvent.dataHandle = nil;
  3930.         ignoreReply.dataHandle             = nil;
  3931.         
  3932.         err = MakeSelfAddress(&ourAddress);
  3933.         
  3934.         /*
  3935.             Build an object to represent the current document's selection
  3936.         */
  3937.         err = MakeSelectedTextObj(theDocument->theWindow, theDocument->theText, &ourTextSelObj);
  3938.         
  3939.         if (err==noErr)
  3940.           {
  3941.                 switch (whatCommand) {
  3942.                     case  editCutCommand         : theEventID    = kAECut;
  3943.                                                                         theEventClass = kAEMiscStandards;
  3944.                                                                         break;
  3945.                     case  editCopyCommand     : theEventID    = kAECopy;
  3946.                                                                         theEventClass = kAEMiscStandards;
  3947.                                                                         break;
  3948.                     case  editPasteCommand     : theEventID    = kAEPaste;
  3949.                                                                         theEventClass = kAEMiscStandards;
  3950.                                                                         break;
  3951.                     case  editClearCommand     : theEventID    = kAEDelete;
  3952.                                                                         theEventClass = kAECoreSuite;
  3953.                                                                         break;
  3954.                 }
  3955.                     
  3956.                 err = AECreateAppleEvent( theEventClass, theEventID, &ourAddress, 0, 0, &editCommandEvent);    
  3957.  
  3958.                 /* add parameter */    
  3959.                 if (err==noErr) 
  3960.                     err = AEPutParamDesc(&editCommandEvent, keyDirectObject, &ourTextSelObj);
  3961.                     
  3962.                 /*and now Send the message*/
  3963.                 if (err==noErr)
  3964.                     err = AESend(&editCommandEvent,&ignoreReply,kAENoReply,kAEHighPriority,10000,nil, nil);
  3965.             }              
  3966.             
  3967.         /*
  3968.             Clean up
  3969.         */
  3970.         if (ourAddress.dataHandle) 
  3971.             forgetErr = AEDisposeDesc(&ourAddress);
  3972.         
  3973.         if (editCommandEvent.dataHandle) 
  3974.             forgetErr = AEDisposeDesc(&editCommandEvent);
  3975.         
  3976.         if (ignoreReply.dataHandle) 
  3977.             forgetErr = AEDisposeDesc(&ignoreReply);
  3978.             
  3979.         if (ourTextSelObj.dataHandle) 
  3980.             forgetErr = AEDisposeDesc(&ourTextSelObj);
  3981.             
  3982.     } /*DoEditCommand*/
  3983.     
  3984. pascal void IssueCutCommand(DPtr theDocument)
  3985.     {            
  3986.         DoEditCommand(theDocument, editCutCommand);
  3987.     } 
  3988.     
  3989. pascal void IssueCopyCommand(DPtr theDocument)
  3990.     {
  3991.         DoEditCommand(theDocument, editCopyCommand);
  3992.     }
  3993.     
  3994. pascal void IssuePasteCommand(DPtr theDocument)
  3995.     {
  3996.         DoEditCommand(theDocument, editPasteCommand);    
  3997.     }
  3998.     
  3999. pascal void IssueClearCommand(DPtr theDocument)
  4000.     {
  4001.         DoEditCommand(theDocument, editClearCommand);    
  4002.     }
  4003.     
  4004. pascal void IssueFontCommand(DPtr theDocument, short theItem)
  4005.     {
  4006.        Str255         name;
  4007.          AEDesc           strDesc;
  4008.          AEAddressDesc  theAddress;
  4009.          OSErr            err;
  4010.          AEDesc         selTextObj;
  4011.             
  4012.         err = MakeSelfAddress(&theAddress);
  4013.         
  4014.         err = MakeSelectedTextObj(theDocument->theWindow,
  4015.                                                             theDocument->theText,
  4016.                                                             &selTextObj);
  4017.         
  4018.         GetItem(myMenus[fontM], theItem, name);
  4019.         
  4020.         if (err==noErr)
  4021.             err  = AECreateDesc(typeChar,
  4022.                                                     (Ptr)&name[1],
  4023.                                                     name[0],
  4024.                                                     &strDesc);
  4025.         
  4026.         if (err==noErr)
  4027.             err  = SendAESetObjProp(&selTextObj, 
  4028.                                                             pFont,
  4029.                                                             &strDesc,
  4030.                                                             &theAddress);                                                            
  4031.     }
  4032.     
  4033. /*
  4034.     Window property routines
  4035. */
  4036.  
  4037. pascal void IssueZoomCommand(WindowPtr whichWindow, short whichPart)
  4038.     {
  4039.       Boolean       zoomBool;
  4040.         AEDesc        zoomDesc;
  4041.         AEAddressDesc selfAddr;
  4042.         AEDesc        frontWinObj;
  4043.         OSErr         err;
  4044.     
  4045.         err = MakeSelfAddress(&selfAddr);
  4046.         
  4047.         err = MakeWindowObj(whichWindow, &frontWinObj);
  4048.         
  4049.         zoomBool = (whichPart==inZoomOut);
  4050.     
  4051.         err = AECreateDesc(typeBoolean,
  4052.                                              (Ptr)&zoomBool,
  4053.                                              sizeof(zoomBool),
  4054.                                              &zoomDesc);
  4055.                                                 
  4056.         err = SendAESetObjProp(&frontWinObj, 
  4057.                                                      pIsZoomed,
  4058.                                                      &zoomDesc,
  4059.                                                      &selfAddr);                                                            
  4060.     } /* IssueZoomCommand */
  4061.     
  4062. pascal void IssueCloseCommand(WindowPtr whichWindow)
  4063.     {
  4064.         AEAddressDesc  selfAddr;
  4065.         AEDesc         frontWinObj;
  4066.         OSErr          err;
  4067.         OSErr          ignoreErr;
  4068.         AppleEvent     closeCommandEvent;
  4069.         AppleEvent     ignoreReply;
  4070.     
  4071.         frontWinObj.dataHandle = nil;
  4072.         
  4073.         err = MakeSelfAddress(&selfAddr);
  4074.         
  4075.         err = MakeWindowObj(whichWindow, &frontWinObj);
  4076.                                                             
  4077.         err = AECreateAppleEvent( kAECoreSuite, kAEClose, &selfAddr, 0, 0, &closeCommandEvent) ;                
  4078.         
  4079.         /* add parameter - the window to close */    
  4080.         if (err==noErr) 
  4081.             err = AEPutParamDesc(&closeCommandEvent, keyDirectObject, &frontWinObj);
  4082.             
  4083.         if (err==noErr) 
  4084.             err = AESend(&closeCommandEvent,&ignoreReply,kAENoReply+kAEAlwaysInteract,kAEHighPriority,10000,nil, nil);
  4085.         
  4086.         if (closeCommandEvent.dataHandle) 
  4087.             ignoreErr = AEDisposeDesc(&closeCommandEvent);
  4088.         
  4089.         if (frontWinObj.dataHandle) 
  4090.             ignoreErr = AEDisposeDesc(&frontWinObj);
  4091.             
  4092.         if (selfAddr.dataHandle) 
  4093.             ignoreErr = AEDisposeDesc(&selfAddr);
  4094.             
  4095.     } /* IssueCloseCommand */
  4096.     
  4097. pascal void IssueSizeWindow(WindowPtr whichWindow, short newHSize, short newVSize)
  4098.     {
  4099.       Rect          sizeRect;
  4100.         Rect          contentRect;
  4101.         short         edgeSize;
  4102.         AEDesc        sizeDesc;
  4103.         AEAddressDesc selfAddr;
  4104.         AEDesc        frontWinObj;
  4105.         OSErr         err;
  4106.     
  4107.         sizeRect    = (**(((WindowPeek)whichWindow)->strucRgn)).rgnBBox;
  4108.         contentRect = (**(((WindowPeek)whichWindow)->contRgn)).rgnBBox;
  4109.         
  4110.         edgeSize = sizeRect.right-sizeRect.left-(contentRect.right-contentRect.left);
  4111.         sizeRect.right = sizeRect.left+newHSize+edgeSize;
  4112.         
  4113.         edgeSize = sizeRect.bottom-sizeRect.top-(contentRect.bottom-contentRect.top);
  4114.         sizeRect.bottom = sizeRect.top+newVSize+edgeSize;
  4115.         
  4116.         err = MakeSelfAddress(&selfAddr);
  4117.         
  4118.         err = MakeWindowObj(whichWindow, &frontWinObj);
  4119.         
  4120.         if (err==noErr)
  4121.             err = AECreateDesc(typeQDRectangle,
  4122.                                                  (Ptr)&sizeRect,
  4123.                                                  sizeof(sizeRect),
  4124.                                                  &sizeDesc);
  4125.         
  4126.         if (err==noErr)
  4127.             err  = SendAESetObjProp(&frontWinObj, 
  4128.                                                             pBounds,
  4129.                                                             &sizeDesc,
  4130.                                                             &selfAddr);                                                            
  4131.     } /*IssueSizeWindow*/
  4132.     
  4133. pascal void IssueMoveWindow(WindowPtr whichWindow, Rect sizeRect)
  4134.     {
  4135.         AEDesc        sizeDesc;
  4136.         AEAddressDesc selfAddr;
  4137.         AEDesc        frontWinObj;
  4138.         OSErr         err;
  4139.     
  4140.         err = MakeSelfAddress(&selfAddr);
  4141.         
  4142.         err = MakeWindowObj(whichWindow, &frontWinObj);
  4143.             
  4144.         if (err==noErr)
  4145.             err = AECreateDesc(typeQDRectangle,
  4146.                                                  (Ptr)&sizeRect,
  4147.                                                  sizeof(sizeRect),
  4148.                                                  &sizeDesc);
  4149.         
  4150.         if (err==noErr)        
  4151.             err = SendAESetObjProp(&frontWinObj, 
  4152.                                                          pBounds,
  4153.                                                          &sizeDesc,
  4154.                                                          &selfAddr);                                                            
  4155.     } /*IssueMoveWindow*/
  4156.  
  4157. pascal void IssuePageSetupWindow(WindowPtr whichWindow, TPrint thePageSetup)
  4158.     {
  4159.         AEDesc        sizeDesc;
  4160.         AEAddressDesc selfAddr;
  4161.         AEDesc        frontWinObj;
  4162.         OSErr         err;
  4163.     
  4164.         err = MakeSelfAddress(&selfAddr);
  4165.         
  4166.         err = MakeWindowObj(whichWindow, &frontWinObj);
  4167.         
  4168.         if (err==noErr)
  4169.             err = AECreateDesc(typeTPrint,
  4170.                                                  (Ptr)&thePageSetup,
  4171.                                                  sizeof(thePageSetup),
  4172.                                                  &sizeDesc);
  4173.                                                  
  4174.         if (err==noErr)
  4175.             err = SendAESetObjProp(&frontWinObj, 
  4176.                                                          pPageSetup,
  4177.                                                          &sizeDesc,
  4178.                                                          &selfAddr);                                                            
  4179.                                                      
  4180.     } /*IssuePageSetupWindow*/
  4181.     
  4182. pascal void IssueShowBorders(WindowPtr whichWindow, Boolean showBorders)
  4183.     {
  4184.         AEDesc        sizeDesc;
  4185.         AEAddressDesc selfAddr;
  4186.         AEDesc        frontWinObj;
  4187.         OSErr         err;
  4188.     
  4189.         err = MakeSelfAddress(&selfAddr);
  4190.         
  4191.         err = MakeWindowObj(whichWindow, &frontWinObj);
  4192.         
  4193.         if (err==noErr)
  4194.             err = AECreateDesc(typeBoolean,
  4195.                                                  (Ptr)&showBorders,
  4196.                                                  sizeof(showBorders),
  4197.                                                  &sizeDesc);
  4198.         
  4199.         if (err==noErr)
  4200.             err = SendAESetObjProp(&frontWinObj, 
  4201.                                                          pShowBorders,
  4202.                                                          &sizeDesc,
  4203.                                                          &selfAddr);                                                            
  4204.     } /*IssueShowBorders*/
  4205.     
  4206. pascal void IssuePrintWindow(WindowPtr whichWindow)
  4207.     {
  4208.         AEAddressDesc selfAddr;
  4209.         AEDesc        frontWinObj;
  4210.         OSErr         err;
  4211.         OSErr         ignoreErr;
  4212.         AppleEvent    printCommandEvent;
  4213.         AppleEvent    ignoreReply;
  4214.     
  4215.         err = MakeSelfAddress(&selfAddr);
  4216.         
  4217.         err = MakeWindowObj(whichWindow, &frontWinObj);
  4218.                                                             
  4219.         err = AECreateAppleEvent(kCoreEventClass, kAEPrintDocuments, &selfAddr, 0, 0, &printCommandEvent) ;                
  4220.  
  4221.         /* 
  4222.             add parameter - the window to print
  4223.         */    
  4224.  
  4225.         if (err==noErr) 
  4226.             err = AEPutParamDesc(&printCommandEvent, keyDirectObject, &frontWinObj);
  4227.             
  4228.         if (err==noErr) 
  4229.             err = AESend(&printCommandEvent,&ignoreReply,kAENoReply+kAEAlwaysInteract,kAEHighPriority,10000,nil, nil);
  4230.     
  4231.       if (printCommandEvent.dataHandle)
  4232.             ignoreErr = AEDisposeDesc(&printCommandEvent);
  4233.         
  4234.         if (frontWinObj.dataHandle) 
  4235.             ignoreErr = AEDisposeDesc(&frontWinObj);
  4236.             
  4237.         if (selfAddr.dataHandle) 
  4238.             ignoreErr = AEDisposeDesc(&selfAddr);
  4239.             
  4240.     } /*IssuePrintWindow*/
  4241.     
  4242. pascal OSErr IssueAEOpenDoc(FSSpec myFSSpec)
  4243. /* send OpenDocs AppleEvent to myself, with a one-element list
  4244.   containing the given file spec
  4245.  
  4246.   NOTES : the core AEOpenDocs event is defined as taking a list of
  4247.           aliases (not file specs) as its direct parameter.  However,
  4248.             we can send the file spec instead and depend on AppleEvents'
  4249.             automatic coercion.  In fact, we don't really even have to put 
  4250.             in a list; AppleEvents will coerce a descriptor into a 1-element
  4251.             list if called for.  In this routine, though, we'll make the
  4252.             list for demonstration purposes.
  4253. */
  4254.  
  4255.  {
  4256.          AppleEvent    myAppleEvent;
  4257.         AppleEvent    defReply;
  4258.         AEDescList    docList;
  4259.         AEAddressDesc selfAddr;
  4260.         OSErr         myErr;
  4261.         OSErr         ignoreErr;
  4262.         
  4263.         myAppleEvent.dataHandle = nil;
  4264.         docList.dataHandle  = nil;
  4265.         selfAddr.dataHandle = nil;
  4266.         defReply.dataHandle = nil;
  4267.             
  4268.         /*
  4269.             Create empty list and add one file spec
  4270.         */
  4271.         myErr = AECreateList(nil,0,false, &docList);
  4272.         
  4273.         if (myErr==noErr) 
  4274.             myErr = AEPutPtr(&docList,1,typeFSS,(Ptr)&myFSSpec,sizeof(myFSSpec));
  4275.             
  4276.         /*
  4277.             Create a self address to send it to
  4278.         */
  4279.         if (myErr==noErr) 
  4280.             myErr = MakeSelfAddress(&selfAddr);
  4281.             
  4282.         if (myErr==noErr) 
  4283.             myErr = AECreateAppleEvent(kCoreEventClass,
  4284.                                                                  kAEOpenDocuments,
  4285.                                                                  &selfAddr,
  4286.                                                                  kAutoGenerateReturnID,
  4287.                                                                  kAnyTransactionID,
  4288.                                                                  &myAppleEvent);
  4289.     
  4290.         /* 
  4291.             Put Params into our event and send it
  4292.         */
  4293.         if (myErr == noErr) 
  4294.             myErr = AEPutParamDesc(&myAppleEvent,
  4295.                                                          keyDirectObject,
  4296.                                                          &docList);
  4297.     
  4298.         myErr = AESend(&myAppleEvent,
  4299.                                      &defReply,
  4300.                                      kAENoReply+kAEAlwaysInteract,
  4301.                                      kAENormalPriority,
  4302.                                      kAEDefaultTimeout,
  4303.                                      nil,
  4304.                                      nil);
  4305.             
  4306.         if (selfAddr.dataHandle) 
  4307.             ignoreErr = AEDisposeDesc(&selfAddr);
  4308.             
  4309.         if (myAppleEvent.dataHandle) 
  4310.             ignoreErr = AEDisposeDesc(&myAppleEvent);
  4311.             
  4312.         if (docList.dataHandle) 
  4313.             ignoreErr = AEDisposeDesc(&docList);
  4314.             
  4315.         return(myErr);
  4316.         
  4317.     }    /* IssueAEOpenDoc */
  4318.  
  4319. pascal void IssueAENewWindow(void)
  4320. /* 
  4321.     send the New Element event to myself with a null container
  4322. */
  4323.     {
  4324.       AppleEvent    myAppleEvent;
  4325.         AppleEvent    defReply;
  4326.         AEAddressDesc selfAddr;
  4327.         OSErr         myErr;
  4328.         OSErr         ignoreErr;
  4329.         DescType      elemClass;
  4330.         
  4331.         myAppleEvent.dataHandle = nil;
  4332.         
  4333.         /*
  4334.             Create the address of us
  4335.         */
  4336.         
  4337.         myErr = MakeSelfAddress(&selfAddr);
  4338.         
  4339.         /*
  4340.             create event 
  4341.         */
  4342.         
  4343.         myErr = AECreateAppleEvent(kAECoreSuite,
  4344.                                                              kAECreateElement,
  4345.                                                              &selfAddr,
  4346.                                                              kAutoGenerateReturnID,
  4347.                                                              kAnyTransactionID,
  4348.                                                              &myAppleEvent);
  4349.         
  4350.         /*
  4351.             attach desired class of new element
  4352.         */
  4353.         
  4354.         elemClass = cWindow;
  4355.         
  4356.         if (myErr == noErr) 
  4357.             myErr = AEPutParamPtr(&myAppleEvent,
  4358.                                                       keyAEObjectClass,
  4359.                                                         typeType,
  4360.                                                         (Ptr)&elemClass,
  4361.                                                         sizeof(elemClass));
  4362.             
  4363.         /*
  4364.             send the event 
  4365.         */
  4366.         
  4367.         if (myErr == noErr) 
  4368.             myErr = AESend(&myAppleEvent,
  4369.                                          &defReply,
  4370.                                          kAENoReply+kAENeverInteract,
  4371.                                          kAENormalPriority,
  4372.                                          kAEDefaultTimeout,
  4373.                                          nil,
  4374.                                          nil);
  4375.         /*
  4376.             Clean up - reply never created so don't throw away
  4377.         */
  4378.         if (selfAddr.dataHandle) 
  4379.             ignoreErr = AEDisposeDesc(&selfAddr);
  4380.             
  4381.         if (myAppleEvent.dataHandle) 
  4382.             ignoreErr = AEDisposeDesc(&myAppleEvent);
  4383.                     
  4384.     }    /* IssueAENewWindow */
  4385.  
  4386. pascal OSErr IssueSaveCommand(WindowPtr theWindow,
  4387.                               FSSpecPtr where)
  4388. /*
  4389.     send an AppleEvent Save Event to myself
  4390. */
  4391.  
  4392. {
  4393.     AEDesc        windowObj;
  4394.     AppleEvent    myAppleEvent;
  4395.     AppleEvent    defReply;
  4396.     OSErr         myErr;
  4397.     OSErr         ignoreErr;
  4398.     AEAddressDesc selfAddr;
  4399.         
  4400.     windowObj.dataHandle = nil;
  4401.     myAppleEvent.dataHandle = nil;
  4402.     
  4403.     myErr = MakeWindowObj(theWindow, &windowObj);
  4404.             
  4405.     if (myErr==noErr) 
  4406.         myErr = MakeSelfAddress(&selfAddr);
  4407.         
  4408.   /*
  4409.         Build event
  4410.     */
  4411.     
  4412.   if (myErr == noErr) 
  4413.         myErr = AECreateAppleEvent(kAECoreSuite,
  4414.                                                              kAESave,
  4415.                                                              &selfAddr,
  4416.                                                              kAutoGenerateReturnID,
  4417.                                                              kAnyTransactionID,
  4418.                                                              &myAppleEvent);
  4419.       
  4420.   /*
  4421.         say which window
  4422.     */
  4423.     
  4424.   if (myErr==noErr) 
  4425.         myErr = AEPutParamDesc(&myAppleEvent,
  4426.                                                      keyDirectObject,
  4427.                                                      &windowObj);
  4428.   
  4429.   /*
  4430.         add optional file param if we need to
  4431.     */
  4432.     
  4433.   if (where) 
  4434.         if (myErr==noErr) 
  4435.             myErr = AEPutParamPtr(&myAppleEvent,
  4436.                                                         keyAEDestination,
  4437.                                                         typeFSS,
  4438.                                                         (Ptr)where,
  4439.                                                         sizeof(FSSpec));
  4440.         
  4441.   /*
  4442.         send the event
  4443.     */
  4444.   if (myErr==noErr) 
  4445.         myErr  = AESend(&myAppleEvent,
  4446.                                         &defReply,
  4447.                                         kAENoReply+kAENeverInteract,
  4448.                                         kAENormalPriority,
  4449.                                         kAEDefaultTimeout,
  4450.                                         nil,
  4451.                                         nil);
  4452.       
  4453.     if (selfAddr.dataHandle) 
  4454.         ignoreErr = AEDisposeDesc(&selfAddr);
  4455.       
  4456.     if (windowObj.dataHandle) 
  4457.         ignoreErr = AEDisposeDesc(&windowObj);
  4458.         
  4459.     if (myAppleEvent.dataHandle) 
  4460.         ignoreErr = AEDisposeDesc(&myAppleEvent);
  4461.         
  4462.     return(myErr);
  4463. }    /* IssueSaveCommand */
  4464.  
  4465. pascal void IssueSelectWindowCommand(WindowPtr theWindow, WindowPtr oldFrontWindow)
  4466. /*
  4467.     send an AppleEvent Move Event to ourself to select the chosen window
  4468.     i.e. bring it to the front. This is the same as move before the front window.
  4469. */
  4470.  
  4471. {
  4472.     AEDesc        windowObj;
  4473.     AEDesc        fWinObj;
  4474.     AEDesc        theDestObject;
  4475.     AEDesc        theDestRecord;
  4476.     DescType      thePosn;
  4477.     AppleEvent    myAppleEvent;
  4478.     AppleEvent    defReply;
  4479.     OSErr         myErr;
  4480.     OSErr         ignoreErr;
  4481.     AEAddressDesc selfAddr;
  4482.         
  4483.     windowObj.dataHandle    = nil;
  4484.     myAppleEvent.dataHandle = nil;
  4485.     
  4486.     myErr = MakeWindowObj(theWindow, &windowObj);
  4487.             
  4488.     if (myErr==noErr) 
  4489.         myErr = MakeSelfAddress(&selfAddr);
  4490.         
  4491.   /*
  4492.         Build event
  4493.     */
  4494.     
  4495.   if (myErr == noErr) 
  4496.         myErr = AECreateAppleEvent(kAECoreSuite,
  4497.                                                              kAEMove,
  4498.                                                              &selfAddr,
  4499.                                                              kAutoGenerateReturnID,
  4500.                                                              kAnyTransactionID,
  4501.                                                              &myAppleEvent);
  4502.       
  4503.   /*
  4504.         say which window
  4505.     */
  4506.     
  4507.   if (myErr==noErr) 
  4508.         myErr = AEPutParamDesc(&myAppleEvent,
  4509.                                                      keyDirectObject,
  4510.                                                      &windowObj);
  4511.   
  4512.   /*
  4513.         add to where param - typeInsertionLoc
  4514.     */
  4515.     
  4516.     if (myErr==noErr)
  4517.         {
  4518.             // Build a record
  4519.             
  4520.             theDestRecord.dataHandle = nil;
  4521.             theDestObject.dataHandle = nil;
  4522.             fWinObj.dataHandle       = nil;
  4523.             
  4524.             myErr = AECreateList(nil, 0, true, &theDestRecord);
  4525.             
  4526.             if (myErr==noErr)
  4527.                 { // add the reference object - the current front window
  4528.  
  4529.                     myErr = MakeWindowObj(oldFrontWindow, &fWinObj);
  4530.                     
  4531.                     if (myErr==noErr)
  4532.                         myErr = AEPutKeyDesc(&theDestRecord,
  4533.                                                                  keyAEObject,
  4534.                                                                  &fWinObj);
  4535.                     
  4536.                     if (fWinObj.dataHandle)
  4537.                         ignoreErr = AEDisposeDesc(&fWinObj);
  4538.                 }
  4539.             
  4540.             // How to place it relative to the reference object
  4541.             thePosn = kAEBefore;
  4542.             
  4543.             if (myErr==noErr)
  4544.                 myErr = AEPutKeyPtr(&theDestRecord,
  4545.                                                       keyAEPosition,
  4546.                                                       typeEnumeration,
  4547.                                                       (Ptr)&thePosn,
  4548.                                                       sizeof(thePosn));
  4549.             
  4550.             if (myErr==noErr)
  4551.                 myErr = AECoerceDesc(&theDestRecord, typeInsertionLoc, &theDestObject);
  4552.             
  4553.             if (theDestRecord.dataHandle)
  4554.                 ignoreErr = AEDisposeDesc(&theDestRecord);
  4555.             
  4556.             if (myErr==noErr)
  4557.                 myErr = AEPutParamDesc(&myAppleEvent,
  4558.                                                              keyAEInsertHere,
  4559.                                                              &theDestObject);
  4560.                                                          
  4561.             if (theDestObject.dataHandle)
  4562.                 ignoreErr = AEDisposeDesc(&theDestObject);
  4563.         }
  4564.         
  4565.   /*
  4566.         send the event
  4567.     */
  4568.   if (myErr==noErr) 
  4569.         myErr  = AESend(&myAppleEvent,
  4570.                                         &defReply,
  4571.                                         kAENoReply+kAEDontExecute,
  4572.                                         kAENormalPriority,
  4573.                                         kAEDefaultTimeout,
  4574.                                         nil,
  4575.                                         nil);
  4576.       
  4577.     if (selfAddr.dataHandle) 
  4578.         ignoreErr = AEDisposeDesc(&selfAddr);
  4579.       
  4580.     if (windowObj.dataHandle) 
  4581.         ignoreErr = AEDisposeDesc(&windowObj);
  4582.         
  4583.     if (myAppleEvent.dataHandle) 
  4584.         ignoreErr = AEDisposeDesc(&myAppleEvent);
  4585.         
  4586. }    /* IssueSelectWindowCommand */
  4587.  
  4588. pascal OSErr IssueRevertCommand(WindowPtr theWindow)
  4589. /*
  4590.     send an AppleEvent Revert Event to myself
  4591. */
  4592.  
  4593.     {
  4594.         AEDesc        windowObj;
  4595.         AppleEvent    myAppleEvent;
  4596.         AppleEvent    defReply;
  4597.         OSErr         myErr;
  4598.         OSErr         ignoreErr;
  4599.         AEAddressDesc selfAddr;
  4600.         
  4601.         windowObj.dataHandle = nil;
  4602.         myAppleEvent.dataHandle = nil;
  4603.         
  4604.         myErr = MakeWindowObj(theWindow, &windowObj);
  4605.                     
  4606.         if (myErr==noErr) 
  4607.             myErr = MakeSelfAddress(&selfAddr);
  4608.             
  4609.         /*
  4610.             Build event
  4611.         */
  4612.         
  4613.         if (myErr == noErr) 
  4614.             myErr  = AECreateAppleEvent(kAEMiscStandards,
  4615.                                                                     kAERevert,
  4616.                                                                     &selfAddr,
  4617.                                                                     kAutoGenerateReturnID,
  4618.                                                                     kAnyTransactionID,
  4619.                                                                     &myAppleEvent);
  4620.         /*
  4621.             say which window
  4622.         */
  4623.         
  4624.         if (myErr == noErr) 
  4625.             myErr = AEPutParamDesc(&myAppleEvent,
  4626.                                                          keyDirectObject,
  4627.                                                          &windowObj);
  4628.         /*
  4629.             send the event
  4630.         */
  4631.         if (myErr==noErr) 
  4632.             myErr  = AESend(&myAppleEvent,
  4633.                                             &defReply,
  4634.                                             kAENoReply+kAENeverInteract,
  4635.                                             kAENormalPriority,
  4636.                                             kAEDefaultTimeout,
  4637.                                             nil,
  4638.                                             nil);
  4639.             
  4640.         if (windowObj.dataHandle) 
  4641.             ignoreErr = AEDisposeDesc(&windowObj);
  4642.             
  4643.         if (myAppleEvent.dataHandle) 
  4644.             ignoreErr = AEDisposeDesc(&myAppleEvent);
  4645.             
  4646.         if (selfAddr.dataHandle) 
  4647.             ignoreErr = AEDisposeDesc(&selfAddr);
  4648.             
  4649.         return(myErr);
  4650.     }    /* IssueRevertCommand */
  4651.  
  4652. /*
  4653.     Name : IssueQuitCommand
  4654.     Purpose : Sends self a Quit AppleEvent
  4655. */
  4656. pascal OSErr IssueQuitCommand(void)
  4657.     {
  4658.         AppleEvent    myAppleEvent;
  4659.         AppleEvent    defReply;
  4660.         OSErr         myErr;
  4661.         OSErr         ignoreErr;
  4662.         AEAddressDesc selfAddr;
  4663.         DescType      mySaveOpt;
  4664.         
  4665.         myAppleEvent.dataHandle = nil;
  4666.         selfAddr.dataHandle     = nil;
  4667.                             
  4668.         myErr = MakeSelfAddress(&selfAddr);
  4669.             
  4670.         /*
  4671.             Build event
  4672.         */
  4673.         
  4674.         if (myErr == noErr) 
  4675.             myErr  = AECreateAppleEvent(kCoreEventClass,
  4676.                                                                     kAEQuitApplication,
  4677.                                                                     &selfAddr,
  4678.                                                                     kAutoGenerateReturnID,
  4679.                                                                     kAnyTransactionID,
  4680.                                                                     &myAppleEvent);
  4681.         /*
  4682.             say which save option
  4683.         */
  4684.         
  4685.         mySaveOpt = kAEAsk;
  4686.         
  4687.         if (myErr == noErr) 
  4688.             myErr = AEPutParamPtr(&myAppleEvent,
  4689.                                                         keyAESaveOptions,
  4690.                                                         typeEnumerated,
  4691.                                                         (Ptr)&mySaveOpt,
  4692.                                                         sizeof(mySaveOpt));
  4693.         /*
  4694.             send the event
  4695.         */
  4696.         if (myErr==noErr) 
  4697.             myErr  = AESend(&myAppleEvent,
  4698.                                             &defReply,
  4699.                                             kAENoReply+kAEAlwaysInteract,
  4700.                                             kAENormalPriority,
  4701.                                             kAEDefaultTimeout,
  4702.                                             nil,
  4703.                                             nil);
  4704.                         
  4705.         if (myAppleEvent.dataHandle) 
  4706.             ignoreErr = AEDisposeDesc(&myAppleEvent);
  4707.             
  4708.         if (selfAddr.dataHandle) 
  4709.             ignoreErr = AEDisposeDesc(&selfAddr);
  4710.             
  4711.         return(myErr);
  4712.     }    /* IssueQuitCommand */
  4713.  
  4714. /*
  4715.      Name :IssueCreatePublisher
  4716.      Purpose :Interact with user to get Publisher info
  4717.                         and the IssueAECommand to Publish currect selection
  4718. */
  4719. pascal void IssueCreatePublisher(DPtr whichDoc)
  4720.     {
  4721.         AEAddressDesc selfAddr;
  4722.         AEDesc        selTextObj;
  4723.         OSErr         err;
  4724.         OSErr         ignoreErr;
  4725.         AppleEvent    publishCommandEvent;
  4726.         AppleEvent    ignoreReply;
  4727.     
  4728.       publishCommandEvent.dataHandle = nil;
  4729.         selfAddr.dataHandle = nil;
  4730.         selTextObj.dataHandle = nil;
  4731.         
  4732.         err = MakeSelfAddress(&selfAddr);
  4733.         
  4734.         if (err==noErr)
  4735.             err = MakeSelectedTextObj(whichDoc->theWindow, whichDoc->theText, &selTextObj);
  4736.                                                             
  4737.         err = AECreateAppleEvent( kAEMiscStandards,
  4738.                                   kAECreatePublisher,
  4739.                                                             &selfAddr,
  4740.                                                             0,
  4741.                                                             0,
  4742.                                                             &publishCommandEvent) ;                
  4743.  
  4744.         /* 
  4745.             add parameter - the text to publish
  4746.         */    
  4747.  
  4748.         if (err==noErr) 
  4749.             err = AEPutParamDesc(&publishCommandEvent, keyDirectObject, &selTextObj);
  4750.             
  4751.         if (err==noErr) 
  4752.             err = AESend(&publishCommandEvent,&ignoreReply,kAENoReply+kAEAlwaysInteract,kAEHighPriority,10000,nil, nil);
  4753.     
  4754.       if (publishCommandEvent.dataHandle)
  4755.             ignoreErr = AEDisposeDesc(&publishCommandEvent);
  4756.         
  4757.         if (selTextObj.dataHandle) 
  4758.             ignoreErr = AEDisposeDesc(&selTextObj);
  4759.             
  4760.         if (selfAddr.dataHandle) 
  4761.             ignoreErr = AEDisposeDesc(&selfAddr);
  4762.             
  4763.     } /*IssueCreatePublisher*/
  4764.     
  4765. #define kOK 1
  4766. #define kCancel 2
  4767. #define kOtherSize 4
  4768. #define kOutlineItem 5
  4769.  
  4770. pascal Boolean PoseSizeDialog(long *whatSize)
  4771.   {
  4772.       GrafPtr   savedPort;
  4773.     DialogPtr aDialog;
  4774.       Str255    aString;
  4775.       short     itemHit;
  4776.  
  4777.         GetPort(&savedPort);
  4778.         aDialog = GetNewDialog(1004, nil, (WindowPtr)-1);
  4779.         ShowWindow(aDialog);
  4780.         SetPort(aDialog);
  4781.         
  4782.         AdornDefaultButton(aDialog, kOutlineItem);
  4783.          
  4784.         /*set the edittext button to contain the right size*/
  4785.         NumToString(*whatSize, aString);
  4786.         SetText(aDialog, kOtherSize, aString);
  4787.      
  4788.         do {
  4789.             ModalDialog(nil, &itemHit);
  4790.         } while ((itemHit!=kOK) && (itemHit!=kCancel));
  4791.         
  4792.         if (itemHit == kOK) 
  4793.             RetrieveText(aDialog, kOtherSize, aString);
  4794.     
  4795.         DisposDialog(aDialog);
  4796.         SetPort(savedPort);
  4797.         
  4798.         if (itemHit == kOK) 
  4799.          {
  4800.              /*set the new size of the text*/
  4801.              StringToNum(aString, whatSize);
  4802.              if ((*whatSize<1) || (*whatSize>2000)) 
  4803.                  *whatSize = 12;
  4804.          }
  4805.         return(itemHit == kOK);
  4806.     }
  4807.     
  4808. pascal void IssueSizeCommand(DPtr theDocument,short theItem)
  4809.     {
  4810.         Str255        name;
  4811.         AEDesc        sizeDesc;
  4812.         AEAddressDesc theAddress;
  4813.         OSErr         err;
  4814.         AEDesc        selTextObj;
  4815.         
  4816.         /*
  4817.             Vars to do with menu processing
  4818.         */
  4819.         short     lastSize;
  4820.         short     upItem;
  4821.         short     downItem;
  4822.         short     otherItem;
  4823.         long      theSize;
  4824.         TextStyle theStyle;
  4825.         short     lineHeight;
  4826.         short     fontAscent;
  4827.             
  4828.         err = MakeSelfAddress(&theAddress);
  4829.         
  4830.         err = MakeSelectedTextObj(theDocument->theWindow, theDocument->theText, &selTextObj);        
  4831.  
  4832.      /*check if the item is on the Size menu*/
  4833.      /*remembering that we can add and delete items from it*/
  4834.      lastSize  = CountMItems(myMenus[sizeM]) - 5;
  4835.      upItem    = lastSize + 2;
  4836.      downItem  = upItem + 1;
  4837.      otherItem = downItem + 2;
  4838.       
  4839.      TEGetStyle((**(theDocument->theText)).selStart,
  4840.                 &theStyle,
  4841.                             &lineHeight,
  4842.                             &fontAscent,
  4843.                             theDocument->theText);
  4844.         
  4845.      GetItem(myMenus[sizeM], theItem, name);
  4846.      
  4847.      if (theItem <= lastSize)
  4848.        {
  4849.          GetItem(myMenus[sizeM], theItem, name);
  4850.        StringToNum(name, &theSize);
  4851.        }
  4852.      else
  4853.        if (theItem == upItem)  
  4854.             theSize = theStyle.tsSize+1;
  4855.          else
  4856.             if (theItem == downItem)
  4857.                       theSize = theStyle.tsSize-1;
  4858.                  else 
  4859.                     if (theItem == otherItem) 
  4860.                         {
  4861.                           theSize = theStyle.tsSize;
  4862.                             if (!PoseSizeDialog(&theSize))
  4863.                                 return;
  4864.                         }
  4865.  
  4866.         if (err==noErr)
  4867.           err = CreateOffsetDescriptor(theSize, &sizeDesc);
  4868.             
  4869.         if (err==noErr)
  4870.             err = SendAESetObjProp(&selTextObj, 
  4871.                                                          pPointSize,
  4872.                                                          &sizeDesc,
  4873.                                                          &theAddress);
  4874.                                                      
  4875.     } /*IssueSizeCommand*/
  4876.     
  4877. pascal void IssueStyleCommand(DPtr theDocument, short theItem)
  4878.     {
  4879.         Style         theFace;
  4880.         OSErr         err;
  4881.         AEDesc        result;
  4882.         AEAddressDesc selfAddr;
  4883.         AEDesc        selTextObj;
  4884.         TextStyle     theStyle;
  4885.         short         lineHeight;
  4886.         short         fontAscent;
  4887.             
  4888.         TEGetStyle((**(theDocument->theText)).selStart,
  4889.                    &theStyle,
  4890.                              &lineHeight,
  4891.                              &fontAscent,
  4892.                              theDocument->theText);
  4893.         
  4894.         theFace = 0;
  4895.     switch (theItem) {
  4896.             case cPlain              : theFace = 0;
  4897.                                 break;
  4898.             case cBold                : theFace = bold;
  4899.                                 break;
  4900.             case cItalic            : theFace = italic;
  4901.                                 break;
  4902.             case cUnderline      : theFace = underline;
  4903.                                 break;
  4904.             case cOutline          : theFace = outline;
  4905.                                 break;
  4906.             case cShadow            : theFace = shadow;
  4907.                                 break;
  4908.             case cCondense        : theFace = condense;
  4909.                                 break;
  4910.             case cExtend            : theFace = extend;
  4911.                                 break;
  4912.     } /*of case */
  4913.  
  4914.     if (theFace==0)
  4915.             err = BuildTypeTextStylesDesc(0, bold+italic+underline+outline+shadow+condense+extend, &result);
  4916.     else
  4917.       if (theFace & theStyle.tsFace)
  4918.               err = BuildTypeTextStylesDesc(0, theFace, &result);
  4919.             else
  4920.               err = BuildTypeTextStylesDesc(theFace, 0, &result);
  4921.                 
  4922.         err = MakeSelfAddress(&selfAddr);
  4923.         
  4924.         if (err==noErr)
  4925.             err = MakeSelectedTextObj(theDocument->theWindow, theDocument->theText, &selTextObj);
  4926.         
  4927.         if (err==noErr)
  4928.             err = SendAESetObjProp(&selTextObj, 
  4929.                                                          pTextStyles,
  4930.                                                          &result,
  4931.                                                          &selfAddr);
  4932.         
  4933.     } /* IssueStyleCommand */
  4934.     
  4935. enum {
  4936.  
  4937. ETX = 0x03, /* Enter key on keyboard or keypad */
  4938. BS  = 0x08, /* Backspace key on keyboard       */
  4939. HT  = 0x09, /* Tab key on keyboard             */
  4940. CR  = 0x0D, /* Return key on keyboard          */
  4941. ESC = 0x1B, /* Clear key on keypad             */
  4942. FS  = 0x1C, /* Left arrow key on keypad        */
  4943. GS  = 0x1D, /* Right arrow key on keypad       */
  4944. RS  = 0x1E, /* Up arrow key on keypad          */
  4945. US  = 0x1F  /* Down arrow key on keypad        */
  4946. };
  4947.  
  4948. pascal OSErr IssueSetDataObjToBufferContents(const AEDesc * theObj)
  4949.     { 
  4950.       OSErr         myErr;
  4951.         OSErr                    ignoreErr;
  4952.         AEAddressDesc theAddress;
  4953.         AppleEvent    myAppleEvent;
  4954.         AppleEvent    defReply;
  4955.  
  4956.         myErr = MakeSelfAddress(&theAddress);
  4957.         
  4958.         /* create event */
  4959.         
  4960.         if (myErr==noErr)
  4961.             myErr = AECreateAppleEvent(kAECoreSuite,
  4962.                                                                  kAESetData,
  4963.                                                                  &theAddress,
  4964.                                                                  0,
  4965.                                                                  0,
  4966.                                                                  &myAppleEvent);
  4967.             
  4968.         /* add prop obj spec to the event */
  4969.         
  4970.         if (myErr==noErr)
  4971.             myErr = AEPutParamDesc(&myAppleEvent, keyDirectObject, theObj);
  4972.         
  4973.         /* add prop data to the event */
  4974.         
  4975.         if (myErr==noErr)
  4976.             myErr = AEPutParamPtr(&myAppleEvent,
  4977.                                                         keyAEData,
  4978.                                                         typeChar,
  4979.                                                         (Ptr)gTypingBuffer,
  4980.                                                         gCharsInBuffer);
  4981.                                                         
  4982.         /* send event */
  4983.         
  4984.         if (myErr==noErr)
  4985.             myErr = AESend(&myAppleEvent,
  4986.                                          &defReply,
  4987.                                          kAENoReply+kAEDontExecute,
  4988.                                          kAENormalPriority,
  4989.                                          kAEDefaultTimeout,
  4990.                                          nil,
  4991.                                          nil);
  4992.  
  4993.         if (theAddress.dataHandle)
  4994.             ignoreErr = AEDisposeDesc(&theAddress);
  4995.             
  4996.         if (myAppleEvent.dataHandle)
  4997.             ignoreErr = AEDisposeDesc(&myAppleEvent);
  4998.             
  4999.         return(myErr);
  5000.     }
  5001.  
  5002. pascal void AddKeyToTypingBuffer(DPtr theDocument, char theKey)
  5003.     {
  5004.         OSErr myErr;
  5005.         OSErr ignoreErr;
  5006.         
  5007.         if (theKey==BS || theKey==FS || theKey==GS || theKey==RS || theKey==US)
  5008.             {
  5009.                 FlushAndRecordTypingBuffer();
  5010.                 if (theKey==BS)
  5011.                     {
  5012.                         if ((**theDocument->theText).selStart!=(**theDocument->theText).selEnd)
  5013.                             {
  5014.                                 myErr = MakeTextObj(theDocument->theWindow,
  5015.                                                                         (**theDocument->theText).selStart,
  5016.                                                                         (**theDocument->theText).selEnd,
  5017.                                                                         &gTypingTargetObject);
  5018.                             }
  5019.                         else
  5020.                             {
  5021.                                 myErr = MakeTextObj(theDocument->theWindow,
  5022.                                                                         (**theDocument->theText).selStart-1,
  5023.                                                                         (**theDocument->theText).selStart,
  5024.                                                                         &gTypingTargetObject);
  5025.                             }
  5026.                             
  5027.                     myErr = IssueSetDataObjToBufferContents(&gTypingTargetObject);
  5028.                         
  5029.                         ignoreErr = AEDisposeDesc(&gTypingTargetObject);
  5030.                         
  5031.                         gTypingTargetObject.dataHandle = nil;
  5032.                     }
  5033.             }
  5034.         else
  5035.             {
  5036.                 if (gCharsInBuffer==0)
  5037.                     myErr = MakeSelectedTextObj(theDocument->theWindow,
  5038.                                                                             theDocument->theText,
  5039.                                                                             &gTypingTargetObject);
  5040.  
  5041.                 gTypingBuffer[gCharsInBuffer++] = theKey;
  5042.             }
  5043.           
  5044.     }
  5045.     
  5046. pascal void FlushAndRecordTypingBuffer(void)
  5047.     { 
  5048.       OSErr  myErr;
  5049.         OSErr  ignoreErr;
  5050.  
  5051.         if (gCharsInBuffer != 0)
  5052.             {
  5053.                 myErr = IssueSetDataObjToBufferContents(&gTypingTargetObject);
  5054.                 
  5055.                 if (gTypingTargetObject.dataHandle)
  5056.                     ignoreErr = AEDisposeDesc(&gTypingTargetObject);
  5057.             }
  5058.             
  5059.         gCharsInBuffer = 0;
  5060.         gTypingTargetObject.dataHandle = 0;
  5061.     }
  5062.     
  5063. /*****************************************************************************/
  5064. /*
  5065.     Object Accessors
  5066. */
  5067.     
  5068. pascal OSErr WindowFromNullAccessor(DescType      wantClass,
  5069.                                                                     const AEDesc  *container,
  5070.                                                                         DescType      containerClass,
  5071.                                                                         DescType      form, 
  5072.                                                                         const AEDesc  *selectionData,
  5073.                                                                         AEDesc        *value,
  5074.                                                                         long          theRefCon)
  5075.     {
  5076. #pragma unused (container,theRefCon)
  5077.     
  5078.         OSErr       myErr;
  5079.         Str255      nameStr;
  5080.         WindowToken theWindow;
  5081.         short       index;
  5082.         AEDesc      resultDesc;
  5083.         
  5084.         myErr = errAEBadKeyForm;    /* or whatever */
  5085.         
  5086.         value->dataHandle     = nil;
  5087.         resultDesc.dataHandle = nil;
  5088.         
  5089.         /* 
  5090.             should only be called with wantClass = cWindow and
  5091.             with containerClass = typeNull or typeMyAppl.
  5092.             Currently accept as either formName or formAbsolutePosition
  5093.         */
  5094.         
  5095.         if ((wantClass != cWindow) || 
  5096.               ((containerClass != typeNull) && (containerClass != typeMyAppl)) ||
  5097.                !((form == formName) || (form == formAbsolutePosition)))
  5098.             return(errAEWrongDataType);
  5099.         
  5100.         if (form == formName)
  5101.             {
  5102.                 myErr     = GetPStringFromDescriptor(selectionData, (char *)nameStr);
  5103.                 theWindow = WindowNameToWindowPtr(nameStr);
  5104.             }
  5105.         
  5106.         if (form == formAbsolutePosition)
  5107.             {
  5108.                 myErr         = GetIntegerFromDescriptor(selectionData, &index);
  5109.                 
  5110.                 if (index<0)
  5111.                     index = CountWindows()+index+1;
  5112.                     
  5113.                 theWindow = GetWindowPtrOfNthWindow(index);
  5114.             }
  5115.             
  5116.         if (myErr == noErr)
  5117.             myErr = AECreateDesc(typeMyWndw, (Ptr)&theWindow, sizeof(theWindow), value);
  5118.                 
  5119.         return(myErr);
  5120.     }    /* WindowFromNullAccessor */
  5121.  
  5122. pascal OSErr ApplicationFromNullAccessor(DescType      wantClass,
  5123.                                                                                  const AEDesc  *container,
  5124.                                                                                  DescType      containerClass,
  5125.                                                                                  DescType      form, 
  5126.                                                                                  const AEDesc  *selectionData,
  5127.                                                                                  AEDesc        *value,
  5128.                                                                                  long          theRefCon)
  5129.     {
  5130. #pragma unused (container,selectionData,theRefCon)
  5131.  
  5132.         OSErr    myErr;
  5133.         appToken theApp;
  5134.         AEDesc   resultDesc;
  5135.         
  5136.         value->dataHandle     = nil;
  5137.         resultDesc.dataHandle = nil;
  5138.         
  5139.         /* 
  5140.             should only be called with wantClass = cWindow and
  5141.             with containerClass = typeNull.
  5142.             Currently accept as either formName or formAbsolutePosition
  5143.         */
  5144.         
  5145.         if ((wantClass != cApplication) || (containerClass != typeNull) ||
  5146.               !((form == formName) || (form == formAbsolutePosition)))
  5147.             return(errAEWrongDataType);
  5148.         
  5149.         if ((form == formName) || (form == formAbsolutePosition))
  5150.             {
  5151.                 theApp.highLongOfPSN = 0;
  5152.                 theApp.lowLongOfPSN  = kCurrentProcess;
  5153.             }
  5154.             
  5155.         myErr = AECreateDesc(typeMyAppl, (Ptr)&theApp, sizeof(theApp), value);
  5156.                 
  5157.         return(myErr);
  5158.     }    /* ApplicationFromNullAccessor */
  5159.  
  5160. pascal void MoveToNonSpace(short *start, short limit, charsHandle myChars)
  5161.     /*
  5162.         Treats space,comma, full stop, ; and : as space chars
  5163.     */
  5164.     { 
  5165.         short x;
  5166.  
  5167.         while (*start<=limit) {
  5168.           x = (**myChars)[*start];
  5169.             if ( x == ' ' ||
  5170.                  x == ',' ||
  5171.                  x == '.' ||
  5172.                  x == ',' ||
  5173.                  x == ':' ||
  5174.                  x == 10  ||
  5175.                  x == 13 )
  5176.                 (*start) +=1;
  5177.             else
  5178.                 return;
  5179.         }
  5180.     }
  5181.     
  5182. pascal void MoveToSpace(short *start, short limit, charsHandle myChars)
  5183.     /*
  5184.         Treats space,comma, full stop, ; and : as space chars
  5185.     */
  5186.     { 
  5187.       short x;
  5188.         
  5189.         while (*start<=limit) {
  5190.           x = (**myChars)[*start];
  5191.             if ( x != ' ' &&
  5192.                  x != ',' &&
  5193.                  x != '.' &&
  5194.                  x != ',' &&
  5195.                  x != ':' &&
  5196.                  x != 10  &&
  5197.                  x != 13 )
  5198.                 (*start) +=1;
  5199.             else
  5200.                 return;
  5201.         }
  5202.     }
  5203.  
  5204. pascal short CountWords(TEHandle inTextHandle, short startAt, short forHowManyChars)
  5205.     {
  5206.         charsHandle myChars;
  5207.         short       start;
  5208.         short       limit;
  5209.         short       myWords;
  5210.             
  5211.         myChars  = (charsHandle)(**inTextHandle).hText;
  5212.         limit    = startAt+forHowManyChars-1;
  5213.         start    = startAt;
  5214.         myWords  = 0;
  5215.         MoveToNonSpace(&start, limit, myChars);
  5216.         while (start<=limit) {
  5217.                 myWords++;
  5218.                 MoveToSpace(&start, limit, myChars);
  5219.                 MoveToNonSpace(&start, limit, myChars);
  5220.             }
  5221.         return(myWords);
  5222.     } /* CountWords */
  5223.     
  5224. pascal void GetNthWordInfo(short    whichWord,
  5225.                                                    TEHandle inTextHandle,
  5226.                                                    short    *wordStartChar,
  5227.                                                    short    *wordLength)
  5228.     /*
  5229.         On entry:    wordStartChar is start of char range to count in
  5230.                             wordLength is number of chars to consider
  5231.                             
  5232.         On Exit : wordStartChar is start of requested word
  5233.                             wordLength is number of chars in word
  5234.     */
  5235.     {
  5236.         charsHandle myChars;
  5237.         short       start;
  5238.         short       limit;
  5239.             
  5240.         myChars  = (charsHandle)(**inTextHandle).hText;
  5241.         limit    = *wordStartChar + *wordLength-1;
  5242.         start    = *wordStartChar;
  5243.         MoveToNonSpace(&start, limit, myChars);
  5244.         while ((start<=limit) && (whichWord>0)) {
  5245.  
  5246.                 whichWord       = whichWord-1;
  5247.                 *wordStartChar  = start;
  5248.                 MoveToSpace(&start, limit, myChars);
  5249.                 *wordLength     = start- *wordStartChar;
  5250.                     
  5251.                 MoveToNonSpace(&start, limit, myChars);
  5252.             }
  5253.     } /* GetNthWordInfo */
  5254.     
  5255. pascal void GetWordInfo(short    whichWord,
  5256.                                               TEHandle inTextHandle,
  5257.                                               short    *wordStartChar,
  5258.                                               short    *wordLength)
  5259.     /*
  5260.         On wordStartChar entry is start of char range to count in
  5261.                             wordLength is number of chars to consider
  5262.                             
  5263.         On Exit : wordStartChar is start of requested word
  5264.                             wordLength is number of chars in word
  5265.     */
  5266.     {
  5267.         short noOfWords;
  5268.                     
  5269.         noOfWords = CountWords(inTextHandle, *wordStartChar, *wordLength);
  5270.         
  5271.         if (whichWord<0)
  5272.             whichWord = noOfWords + whichWord + 1;
  5273.             
  5274.         if (whichWord>noOfWords)
  5275.             {
  5276.                 *wordStartChar = *wordStartChar+*wordLength;
  5277.                 *wordLength    = 0;
  5278.             }
  5279.         else
  5280.             GetNthWordInfo(whichWord, inTextHandle, wordStartChar, wordLength);
  5281.     }
  5282.     
  5283. pascal short CountLines(TEHandle inTextHandle)
  5284.     {
  5285.         /*
  5286.             CountLines makes use of info in TERec
  5287.         */
  5288.         return((**inTextHandle).nLines);
  5289.     }
  5290.     
  5291. pascal short LineOfOffset(TEHandle theHTE, short charOffset)
  5292.     {
  5293.         short n;
  5294.     
  5295.         n = (**theHTE).nLines;
  5296.         
  5297.         while (((**theHTE).lineStarts[n-1]>charOffset) &&
  5298.                      (n>0))
  5299.              n--;
  5300.             
  5301.         return(n);
  5302.     } /* LineOfOffset */
  5303.  
  5304. pascal void GetLineInfo(short    whichLine,
  5305.                                                 TEHandle inTextHandle,
  5306.                                               short    *lineStartChar,
  5307.                                               short    *lineLength)
  5308.     {
  5309.         short       noOfLines;
  5310.         charsHandle myChars;
  5311.         
  5312.         /* Addition of lines within text object */
  5313.         short       lineOfStart;
  5314.         short       lineOfEnd;
  5315.         
  5316.         lineOfStart = LineOfOffset(inTextHandle, *lineStartChar);
  5317.         lineOfEnd   = LineOfOffset(inTextHandle, *lineStartChar+*lineLength-1);
  5318.             
  5319.         myChars   = (charsHandle)(**inTextHandle).hText;
  5320.         noOfLines = lineOfEnd - lineOfStart + 1;
  5321.         
  5322.         if (whichLine<0)
  5323.             whichLine = noOfLines + whichLine + 1;
  5324.             
  5325.         noOfLines = CountLines(inTextHandle);
  5326.         whichLine = whichLine + lineOfStart - 1; /* convert offset relative to offset absolute */
  5327.         
  5328.         /* End of addition */
  5329.         
  5330.         if (whichLine<=lineOfEnd)
  5331.             {
  5332.                 *lineStartChar = (**inTextHandle).lineStarts[whichLine-1];
  5333.                 if (whichLine==noOfLines)
  5334.                     *lineLength  = (**inTextHandle).teLength;
  5335.                 else
  5336.                     *lineLength  = (**inTextHandle).lineStarts[whichLine];
  5337.                 *lineLength    = *lineLength-*lineStartChar;
  5338.                 /*
  5339.                     Don't return CR
  5340.                 */
  5341.                 if ((**myChars)[ *lineStartChar+*lineLength-1] == 13)
  5342.                     *lineLength = *lineLength-1;
  5343.             }
  5344.         else
  5345.             {
  5346.                 if (whichLine<noOfLines)
  5347.                   *lineStartChar = (**inTextHandle).lineStarts[whichLine]; /* start of whichLine++ */
  5348.                 else
  5349.                     *lineStartChar = (**inTextHandle).teLength;
  5350.                 *lineLength    = 0;
  5351.             }
  5352.     } /* GetLineInfo */
  5353.     
  5354. pascal OSErr TextElemFromWndwAccessor(DescType     wantClass,
  5355.                                                                         const AEDesc *container,
  5356.                                                                         DescType     containerClass,
  5357.                                                                         DescType     form,
  5358.                                                                         const AEDesc *selectionData,
  5359.                                                                         AEDesc       *value,
  5360.                                                                             long         theRefCon)
  5361.   { 
  5362. #pragma unused (theRefCon)
  5363.     
  5364.         OSErr       myErr;
  5365.         OSErr       ignoreErr;
  5366.         WindowToken theWindow;
  5367.         Size        actSize;
  5368.         long        index;
  5369.         TextToken   theTextToken;
  5370.         AERecord    selectionRecord;
  5371.         TextToken   startText;
  5372.         TextToken   stopText;
  5373.         DescType    returnedType;
  5374.         AEDesc      windDesc;
  5375.         TEHandle    theHTE;
  5376.         DPtr        theDocument;
  5377.         short       wordStartChar;
  5378.         short       wordLength;
  5379.     
  5380.         myErr = -1700;    /* or whatever */
  5381.         
  5382.         selectionRecord.dataHandle = nil;
  5383.         
  5384.         /* do some checking for robustness' sake */
  5385.         
  5386.         if ((containerClass != cWindow) ||
  5387.               ((wantClass != cChar) && 
  5388.                  (wantClass != cSpot) && 
  5389.                  (wantClass != cWord) &&
  5390.                  (wantClass != cLine)    ) ||
  5391.               ((form!=formRange) && (form!=formAbsolutePosition)))
  5392.             return(errAEWrongDataType);
  5393.             
  5394.         /* let's get the window which contains the text element */
  5395.         
  5396.         myErr = AECoerceDesc(container, typeMyWndw, &windDesc);
  5397.         GetRawDataFromDescriptor(    &windDesc,
  5398.                                                             (Ptr)&theWindow,
  5399.                                                             sizeof(theWindow),
  5400.                                                             &actSize);
  5401.         ignoreErr = AEDisposeDesc(&windDesc);
  5402.                                                             
  5403.         if (theWindow==nil)
  5404.             myErr = errAEIllegalIndex;
  5405.         else
  5406.             {
  5407.                                                                                     
  5408.                 theTextToken.tokenWindow = theWindow;
  5409.                 
  5410.                 theDocument = DPtrFromWindowPtr(theTextToken.tokenWindow);
  5411.                 theHTE      = theDocument->theText;
  5412.                 
  5413.                 if (form == formAbsolutePosition)
  5414.                     {
  5415.                         myErr = GetLongIntFromDescriptor(selectionData, &index);
  5416.                         
  5417.                         if (wantClass==cSpot)
  5418.                             {
  5419.                               if (index<0)
  5420.                                     theTextToken.tokenOffset = (**theHTE).teLength+index+2; /* Past last char */
  5421.                                 else
  5422.                                     theTextToken.tokenOffset = index;
  5423.                                     
  5424.                                 theTextToken.tokenLength = 0;
  5425.                             }
  5426.                             
  5427.                         if (wantClass==cChar)
  5428.                             {
  5429.                                 if (index<0)
  5430.                                     theTextToken.tokenOffset = (**theHTE).teLength+index+1;
  5431.                                 else
  5432.                                   theTextToken.tokenOffset = index;
  5433.                                     
  5434.                                 theTextToken.tokenLength = 1;
  5435.                             }
  5436.                         
  5437.                         if (wantClass==cWord)
  5438.                             {
  5439.                                 wordStartChar = 0;
  5440.                                 wordLength    = (**theHTE).teLength;
  5441.                                 GetWordInfo(index, theHTE, &wordStartChar, &wordLength); /* zero based */
  5442.                                 theTextToken.tokenOffset = wordStartChar+1;
  5443.                                 theTextToken.tokenLength = wordLength;
  5444.                             }
  5445.                             
  5446.                         if (wantClass==cLine)
  5447.                             {
  5448.                                 wordStartChar = 0;
  5449.                                 wordLength    = (**theHTE).teLength;
  5450.                                 GetLineInfo(index, theHTE, &wordStartChar, &wordLength); /* zero based */
  5451.                                 theTextToken.tokenOffset = wordStartChar+1;
  5452.                                 theTextToken.tokenLength = wordLength;
  5453.                             }
  5454.                     }    /* of formAbsolutePosition */
  5455.                 
  5456.                 if (form == formRange)
  5457.                     {
  5458.                         /* coerce the selection data into an AERecord */
  5459.                         
  5460.                          myErr = AECoerceDesc(selectionData, typeAERecord, &selectionRecord);
  5461.                         
  5462.                         /* get the start object as a text token - 
  5463.                                 this will reenter this proc but as formAbsolutePosition via the coercion handler*/
  5464.                         
  5465.                         myErr =  AEGetKeyPtr(&selectionRecord,
  5466.                                                                  keyAERangeStart,
  5467.                                                                  typeMyText,
  5468.                                                                  &returnedType,
  5469.                                                                  (Ptr)&startText,
  5470.                                                                  sizeof(startText),
  5471.                                                                  &actSize);
  5472.                         
  5473.                         /* now do the same for the stop object */
  5474.                         
  5475.                         if (myErr==noErr)
  5476.                             myErr =  AEGetKeyPtr(&selectionRecord,
  5477.                                                                      keyAERangeStop,
  5478.                                                                      typeMyText,
  5479.                                                                      &returnedType,
  5480.                                                                      (Ptr)&stopText,
  5481.                                                                      sizeof(stopText),
  5482.                                                                      &actSize);
  5483.                         
  5484.                         if (myErr==noErr)
  5485.                             if ((theTextToken.tokenWindow != stopText.tokenWindow) ||
  5486.                                   (theTextToken.tokenWindow != startText.tokenWindow))
  5487.                                 myErr = errAECorruptData;    /* or whatever ????*/
  5488.                             
  5489.                         theTextToken.tokenOffset  = startText.tokenOffset;            
  5490.                         theTextToken.tokenLength  = stopText.tokenOffset +
  5491.                                                                                  stopText.tokenLength - 
  5492.                                                                                  startText.tokenOffset;
  5493.                                                                                  
  5494.                         if (theTextToken.tokenLength<0)
  5495.                             myErr = errAECorruptData;    /* or whatever */
  5496.                                                                              
  5497.                         ignoreErr = AEDisposeDesc(&selectionRecord);
  5498.                         
  5499.                     }    /* of formRange */
  5500.             }
  5501.         
  5502.         /* return theTextToken in a descriptor */
  5503.         
  5504.         if (myErr==noErr)
  5505.             myErr = AECreateDesc(typeMyText,
  5506.                                                      (Ptr)&theTextToken,
  5507.                                                      sizeof(theTextToken),
  5508.                                                      value);
  5509.                 
  5510.         return(myErr);
  5511.     }    /* TextElemFromWndwAccessor */
  5512.  
  5513. pascal OSErr TextElemFromTextAccessor(DescType     wantClass,
  5514.                                                                         const AEDesc *container,
  5515.                                                                         DescType     containerClass,
  5516.                                                                         DescType     form,
  5517.                                                                         const AEDesc *selectionData,
  5518.                                                                         AEDesc       *value,
  5519.                                                                         long         theRefCon)
  5520.     { 
  5521. #pragma unused (theRefCon, containerClass)
  5522.  
  5523.         OSErr       myErr;
  5524.         OSErr       ignoreErr;
  5525.         Size        actSize;
  5526.         long        index;
  5527.         TextToken   theTextToken;
  5528.         AERecord    selectionRecord;
  5529.         TextToken   startText;
  5530.         TextToken   stopText;
  5531.         DescType    returnedType;
  5532.         AEDesc      textDesc;
  5533.         TEHandle    theHTE;
  5534.         short       wordStartChar;
  5535.         short       wordLength;
  5536.         DPtr        theDocument;
  5537.     
  5538.         myErr = -1700;    /* or whatever */
  5539.             
  5540.         /* do some checking for robustness' sake */
  5541.         
  5542.         if (((wantClass != cChar) && 
  5543.                  (wantClass != cSpot) && 
  5544.                  (wantClass != cLine) && 
  5545.                  (wantClass != cWord)) ||
  5546.               ((form != formAbsolutePosition) && (form != formRange)))
  5547.             return(errAEWrongDataType);
  5548.         
  5549.         /* let's get the src text */
  5550.         
  5551.         myErr = AECoerceDesc(container, typeMyText, &textDesc);
  5552.         GetRawDataFromDescriptor(    &textDesc,
  5553.                                                             (Ptr)&theTextToken,
  5554.                                                             sizeof(theTextToken),
  5555.                                                             &actSize);
  5556.                                                             
  5557.         ignoreErr = AEDisposeDesc(&textDesc);
  5558.                                                             
  5559.         theDocument = DPtrFromWindowPtr(theTextToken.tokenWindow);
  5560.         theHTE      = theDocument->theText;
  5561.         
  5562.         if (form == formAbsolutePosition)
  5563.             {
  5564.                 myErr = GetLongIntFromDescriptor(selectionData, &index);
  5565.                 
  5566.                 if (wantClass==cSpot)
  5567.                     {
  5568.                         if (index<0)
  5569.                             theTextToken.tokenOffset = theTextToken.tokenOffset+index+1+theTextToken.tokenLength;
  5570.                         else
  5571.                             theTextToken.tokenOffset = theTextToken.tokenOffset+index-1;
  5572.                         theTextToken.tokenLength = 0;
  5573.                     }
  5574.                     
  5575.                 if (wantClass==cChar)
  5576.                     {
  5577.                         if (index<0)
  5578.                             theTextToken.tokenOffset = theTextToken.tokenOffset+index+1+theTextToken.tokenLength;
  5579.                         else
  5580.                             theTextToken.tokenOffset = theTextToken.tokenOffset+index-1;
  5581.                         theTextToken.tokenLength = 1;
  5582.                     }
  5583.                                     
  5584.                 if (wantClass==cWord)
  5585.                     {
  5586.                         wordStartChar = theTextToken.tokenOffset-1;
  5587.                         wordLength    = theTextToken.tokenLength;
  5588.                         
  5589.                         GetWordInfo(index, theHTE, &wordStartChar, &wordLength);/*zero based*/
  5590.                         
  5591.                         theTextToken.tokenOffset = wordStartChar+1;
  5592.                         theTextToken.tokenLength = wordLength;
  5593.                     }
  5594.                     
  5595.                 if (wantClass==cLine)
  5596.                     {
  5597.                         wordStartChar = theTextToken.tokenOffset-1;
  5598.                         wordLength    = theTextToken.tokenLength;
  5599.                         
  5600.                         GetLineInfo(index, theHTE, &wordStartChar, &wordLength);
  5601.                         
  5602.                         theTextToken.tokenOffset = wordStartChar+1;
  5603.                         theTextToken.tokenLength = wordLength;
  5604.                     }
  5605.     
  5606.             }    /* of formAbsolutePosition */
  5607.         
  5608.         
  5609.         if (form == formRange)
  5610.             {
  5611.                 /* coerce the selection data into an AERecord */
  5612.                 
  5613.                  myErr = AECoerceDesc(selectionData, typeAERecord, &selectionRecord);
  5614.                 
  5615.                 /* get the start object as a text token - 
  5616.                         this will reenter this proc but as formAbsolutePosition via the coercion handler*/
  5617.                 
  5618.                 myErr =  AEGetKeyPtr(&selectionRecord,
  5619.                                                          keyAERangeStart,
  5620.                                                          typeMyText,
  5621.                                                          &returnedType,
  5622.                                                          (Ptr)&startText,
  5623.                                                          sizeof(startText),
  5624.                                                          &actSize);
  5625.                 
  5626.                 /* now do the same for the stop object */
  5627.                 
  5628.                 if (myErr==noErr)
  5629.                     myErr =  AEGetKeyPtr(&selectionRecord,
  5630.                                                              keyAERangeStop,
  5631.                                                              typeMyText,
  5632.                                                              &returnedType,
  5633.                                                              (Ptr)&stopText,
  5634.                                                              sizeof(stopText),
  5635.                                                              &actSize);
  5636.                 
  5637.                 if (myErr==noErr)
  5638.                     if ((theTextToken.tokenWindow != stopText.tokenWindow) ||
  5639.                           (theTextToken.tokenWindow != startText.tokenWindow))
  5640.                         myErr = errAECorruptData;    /* or whatever */
  5641.                     
  5642.                 theTextToken.tokenOffset  = startText.tokenOffset;            
  5643.                 theTextToken.tokenLength  = stopText.tokenOffset +
  5644.                                                                          stopText.tokenLength - 
  5645.                                                                          startText.tokenOffset;
  5646.                                                                      
  5647.                 ignoreErr = AEDisposeDesc(&selectionRecord);
  5648.             }    /* of formRange */
  5649.             
  5650.         /* return theTextToken in a descriptor */
  5651.         
  5652.         myErr = AECreateDesc( typeMyText,
  5653.                                                     (Ptr)&theTextToken,
  5654.                                                     sizeof(theTextToken),
  5655.                                                     value);
  5656.             
  5657.         return(myErr);
  5658.     }    /* TextElemFromTextAccessor */
  5659.  
  5660. pascal OSErr PropertyFromTextAccessor(DescType     wantClass,
  5661.                                                                             const AEDesc *container,
  5662.                                                                             DescType     containerClass,
  5663.                                                                             DescType     form, 
  5664.                                                                             const AEDesc *selectionData,
  5665.                                                                             AEDesc       *value,
  5666.                                                                             long         theRefCon)
  5667.   {
  5668. #pragma unused (theRefCon, containerClass)
  5669.     
  5670.         OSErr         myErr;
  5671.         OSErr         ignoreErr;
  5672.         TextToken     theTextToken;
  5673.         DescType      theProperty;
  5674.         AEDesc        textDesc;
  5675.         AEDesc        propDesc;
  5676.         Size          actualSize;
  5677.         textPropToken myTextProp;
  5678.             
  5679.         value->dataHandle   = nil;
  5680.         textDesc.dataHandle = nil;
  5681.         propDesc.dataHandle = nil;
  5682.         
  5683.         if ((wantClass != cProperty) ||
  5684.                 (form != formPropertyID))
  5685.             {
  5686.                 return(errAEWrongDataType);
  5687.             }
  5688.         
  5689.         /* get the text token */
  5690.         myErr = AECoerceDesc(container, typeMyText, &textDesc);
  5691.         GetRawDataFromDescriptor(    &textDesc,
  5692.                                                             (Ptr)&theTextToken,
  5693.                                                             sizeof(theTextToken),
  5694.                                                             &actualSize);
  5695.                 
  5696.         /* get the property */
  5697.         myErr = AECoerceDesc(selectionData, typeType, &propDesc);
  5698.         GetRawDataFromDescriptor(&propDesc,
  5699.                                                          (Ptr)&theProperty,
  5700.                                                          sizeof(theProperty),
  5701.                                                          &actualSize);
  5702.         /*
  5703.             Combine the two into single token
  5704.         */
  5705.         myTextProp.propertyTextToken = theTextToken;
  5706.         myTextProp.propertyProperty  = theProperty;
  5707.         
  5708.         myErr = AECreateDesc(typeMyTextProp,
  5709.                                                  (Ptr)&myTextProp,
  5710.                                                  sizeof(myTextProp),
  5711.                                                  value);
  5712.             
  5713.         if (textDesc.dataHandle)
  5714.             ignoreErr = AEDisposeDesc(&textDesc);
  5715.             
  5716.         if (propDesc.dataHandle)
  5717.             ignoreErr = AEDisposeDesc(&propDesc);
  5718.             
  5719.         return(myErr);
  5720. }    /* PropertyFromTextAccessor */
  5721.  
  5722. pascal OSErr PropertyFromWndwAccessor(DescType     wantClass,
  5723.                                                                         const AEDesc *container,
  5724.                                                                         DescType     containerClass,
  5725.                                                                         DescType     form, 
  5726.                                                                         const AEDesc *selectionData,
  5727.                                                                         AEDesc       *value,
  5728.                                                                         long         theRefCon)
  5729.   { 
  5730. #pragma unused (theRefCon, containerClass)
  5731.     
  5732.         OSErr           myErr;
  5733.         OSErr           ignoreErr;
  5734.         WindowToken     theWindowToken;
  5735.         DescType        theProperty;
  5736.         AEDesc          windowDesc;
  5737.         AEDesc          propDesc;
  5738.         Size            actualSize;
  5739.         windowPropToken myWindowProp;
  5740.         
  5741.         value->dataHandle     = nil;
  5742.         windowDesc.dataHandle = nil;
  5743.         propDesc.dataHandle   = nil;
  5744.         
  5745.         if ((wantClass != cProperty) ||
  5746.               (form != formPropertyID))
  5747.             {
  5748.                 return(errAEWrongDataType);
  5749.             }
  5750.         
  5751.         /* get the window token - it's the container */
  5752.         
  5753.         myErr = AECoerceDesc(container, typeMyWndw, &windowDesc);
  5754.         GetRawDataFromDescriptor(    &windowDesc,
  5755.                                                             (Ptr)&theWindowToken,
  5756.                                                             sizeof(theWindowToken),
  5757.                                                             &actualSize);
  5758.                                                             
  5759.         /* Check the window exists */
  5760.         
  5761.         if (theWindowToken==nil)
  5762.             myErr = errAEIllegalIndex;
  5763.         else
  5764.             {
  5765.             
  5766.                 /* get the property - it's in the selection data */
  5767.                 
  5768.                 myErr = AECoerceDesc(selectionData, typeType, &propDesc);
  5769.                 GetRawDataFromDescriptor(    &propDesc,
  5770.                                                                     (Ptr)&theProperty,
  5771.                                                                     sizeof(theProperty),
  5772.                                                                     &actualSize);
  5773.                 /*
  5774.                     Combine the two into single token
  5775.                 */
  5776.                 myWindowProp.tokenWindowToken = theWindowToken;
  5777.                 myWindowProp.tokenProperty    = theProperty;
  5778.                 
  5779.                 myErr = AECreateDesc( typeMyWindowProp,
  5780.                                                             (Ptr)&myWindowProp,
  5781.                                                             sizeof(myWindowProp),
  5782.                                                             value);
  5783.             }
  5784.             
  5785.         if (windowDesc.dataHandle)
  5786.             ignoreErr = AEDisposeDesc(&windowDesc);
  5787.             
  5788.         if (propDesc.dataHandle)
  5789.             ignoreErr = AEDisposeDesc(&propDesc);
  5790.             
  5791.         return(myErr);
  5792.   }    /* PropertyFromWndwAccessor */
  5793.  
  5794. pascal OSErr PropertyFromApplAccessor(DescType     wantClass,
  5795.                                                                             const AEDesc *container,
  5796.                                                                             DescType     containerClass,
  5797.                                                                             DescType     form, 
  5798.                                                                             const AEDesc *selectionData,
  5799.                                                                             AEDesc       *value,
  5800.                                                                             long         theRefCon)
  5801.   {
  5802. #pragma unused (theRefCon, containerClass)
  5803.     
  5804.         OSErr         myErr;
  5805.         OSErr         ignoreErr;
  5806.         appToken      theApplToken;
  5807.         DescType      theProperty;
  5808.         AEDesc        applDesc;
  5809.         AEDesc        propDesc;
  5810.         Size          actualSize;
  5811.         applPropToken myApplProp;
  5812.             
  5813.         value->dataHandle     = nil;
  5814.         applDesc.dataHandle   = nil;
  5815.         propDesc.dataHandle   = nil;
  5816.         
  5817.         if ((wantClass != cProperty) ||
  5818.               (form != formPropertyID))
  5819.             {
  5820.                 return(errAEWrongDataType);
  5821.             }
  5822.         
  5823.         /* get the application token - it's the container */
  5824.         
  5825.         myErr = AECoerceDesc(container, typeMyAppl, &applDesc);
  5826.         GetRawDataFromDescriptor(&applDesc,
  5827.                                                          (Ptr)&theApplToken,
  5828.                                                          sizeof(theApplToken),
  5829.                                                          &actualSize);
  5830.                 
  5831.         /* get the property - it's in the selection data */
  5832.         
  5833.         myErr = AECoerceDesc(selectionData, typeType, &propDesc);
  5834.         GetRawDataFromDescriptor(&propDesc,
  5835.                                                          (Ptr)&theProperty,
  5836.                                                          sizeof(theProperty),
  5837.                                                          &actualSize);
  5838.         /*
  5839.             Combine the two into single token
  5840.         */
  5841.         myApplProp.tokenApplToken    = theApplToken;
  5842.         myApplProp.tokenApplProperty = theProperty;
  5843.         
  5844.         myErr = AECreateDesc(typeMyApplProp,
  5845.                                                  (Ptr)&myApplProp,
  5846.                                                  sizeof(myApplProp),
  5847.                                                  value);
  5848.             
  5849.         if (applDesc.dataHandle)
  5850.             ignoreErr = AEDisposeDesc(&applDesc);
  5851.             
  5852.         if (propDesc.dataHandle)
  5853.             ignoreErr = AEDisposeDesc(&propDesc);
  5854.             
  5855.         return(myErr);
  5856. }    /* PropertyFromApplAccessor */
  5857.  
  5858. pascal OSErr MenuNameToMenuToken(const Str255 theName, MenuToken *theToken)
  5859.     {
  5860.         short   index;
  5861.         
  5862.         for (index=appleM; index<=kLastMenu; index++)
  5863.          {
  5864.                 if (IUEqualString(theName, (**(myMenus[index])).menuData)==0)
  5865.                   {
  5866.                         theToken->theTokenMenu = myMenus[index];
  5867.                         theToken->theTokenID   = index+appleID;
  5868.                         return(noErr);
  5869.                     }
  5870.          }
  5871.         return(errAEIllegalIndex);
  5872.     }
  5873.  
  5874. pascal OSErr MenuFromNullAccessor(DescType      wantClass,
  5875.                                                                     const AEDesc  *container,
  5876.                                                                     DescType      containerClass,
  5877.                                                                     DescType      form, 
  5878.                                                                     const AEDesc  *selectionData,
  5879.                                                                     AEDesc        *value,
  5880.                                                                     long          theRefCon)
  5881.     {
  5882. #pragma unused (container,theRefCon)
  5883.     
  5884.         OSErr       myErr;
  5885.         Str255      nameStr;
  5886.         MenuToken   theMenu;
  5887.         short       index;
  5888.         AEDesc      resultDesc;
  5889.         
  5890.         myErr = errAEBadKeyForm;    /* or whatever */
  5891.         
  5892.         value->dataHandle     = nil;
  5893.         resultDesc.dataHandle = nil;
  5894.         
  5895.         /* 
  5896.             should only be called with wantClass = cMenu and
  5897.             with containerClass = typeNull or typeMyAppl.
  5898.             Currently accept as either formName or formAbsolutePosition
  5899.         */
  5900.         
  5901.         if ((wantClass != cMenu) || 
  5902.               ((containerClass != typeNull) && (containerClass != typeMyAppl)) ||
  5903.                !((form == formName) || (form == formAbsolutePosition)))
  5904.             return(errAEWrongDataType);
  5905.         
  5906.         if (form == formName)
  5907.             {
  5908.                 myErr = GetPStringFromDescriptor(selectionData, (char *)nameStr);
  5909.                 myErr = MenuNameToMenuToken(nameStr, &theMenu);
  5910.             }
  5911.         
  5912.         if (form == formAbsolutePosition)
  5913.             {
  5914.                 myErr     = GetIntegerFromDescriptor(selectionData, &index);
  5915.                 if (index<0)
  5916.                     index = kLastMenu + index + 1;
  5917.                     
  5918.                 if (index>0 && index<=kLastMenu+1)
  5919.                     {
  5920.                         theMenu.theTokenMenu = myMenus[index-1];
  5921.                         theMenu.theTokenID   = index-1+appleID;
  5922.                     }
  5923.                 else
  5924.               myErr = errAEIllegalIndex;    /* or whatever */
  5925.             }
  5926.             
  5927.         if (myErr == noErr)
  5928.             myErr = AECreateDesc(typeMyMenu, (Ptr)&theMenu, sizeof(theMenu), value);
  5929.                 
  5930.         return(myErr);
  5931.     }    /* MenuFromNullAccessor */
  5932.  
  5933. pascal OSErr PropertyFromMenuAccessor(DescType     wantClass,
  5934.                                                                             const AEDesc *container,
  5935.                                                                             DescType     containerClass,
  5936.                                                                             DescType     form, 
  5937.                                                                             const AEDesc *selectionData,
  5938.                                                                             AEDesc       *value,
  5939.                                                                             long         theRefCon)
  5940.   {
  5941. #pragma unused (theRefCon, containerClass)
  5942.     
  5943.         OSErr         myErr;
  5944.         OSErr         ignoreErr;
  5945.         MenuToken     theMenuToken;
  5946.         DescType      theProperty;
  5947.         AEDesc        menuDesc;
  5948.         AEDesc        propDesc;
  5949.         Size          actualSize;
  5950.         MenuPropToken myMenuProp;
  5951.             
  5952.         value->dataHandle     = nil;
  5953.         menuDesc.dataHandle   = nil;
  5954.         propDesc.dataHandle   = nil;
  5955.         
  5956.         if ((wantClass != cProperty) ||
  5957.               (form != formPropertyID))
  5958.             {
  5959.                 return(errAEWrongDataType);
  5960.             }
  5961.         
  5962.         /* get the menu token - it's the container */
  5963.         
  5964.         myErr = AECoerceDesc(container, typeMyMenu, &menuDesc);
  5965.         GetRawDataFromDescriptor(&menuDesc,
  5966.                                                          (Ptr)&theMenuToken,
  5967.                                                          sizeof(theMenuToken),
  5968.                                                          &actualSize);
  5969.                 
  5970.         /* get the property - it's in the selection data */
  5971.         
  5972.         myErr = AECoerceDesc(selectionData, typeType, &propDesc);
  5973.         GetRawDataFromDescriptor(&propDesc,
  5974.                                                          (Ptr)&theProperty,
  5975.                                                          sizeof(theProperty),
  5976.                                                          &actualSize);
  5977.         /*
  5978.             Combine the two into single token
  5979.         */
  5980.         myMenuProp.theMenuToken = theMenuToken;
  5981.         myMenuProp.theMenuProp  = theProperty;
  5982.         
  5983.         myErr = AECreateDesc(typeMyMenuProp,
  5984.                                                  (Ptr)&myMenuProp,
  5985.                                                  sizeof(myMenuProp),
  5986.                                                  value);
  5987.             
  5988.         if (menuDesc.dataHandle)
  5989.             ignoreErr = AEDisposeDesc(&menuDesc);
  5990.             
  5991.         if (propDesc.dataHandle)
  5992.             ignoreErr = AEDisposeDesc(&propDesc);
  5993.             
  5994.         return(myErr);
  5995. }    /* PropertyFromMenuAccessor */
  5996.  
  5997. pascal OSErr PropertyFromMenuItemAccessor(DescType     wantClass,
  5998.                                                                                     const AEDesc *container,
  5999.                                                                                     DescType     containerClass,
  6000.                                                                                     DescType     form, 
  6001.                                                                                     const AEDesc *selectionData,
  6002.                                                                                     AEDesc       *value,
  6003.                                                                                     long         theRefCon)
  6004.   {
  6005. #pragma unused (theRefCon, containerClass)
  6006.     
  6007.         OSErr         myErr;
  6008.         OSErr         ignoreErr;
  6009.         MenuItemToken theMenuItemToken;
  6010.         DescType      theProperty;
  6011.         AEDesc        itemDesc;
  6012.         AEDesc        propDesc;
  6013.         Size          actualSize;
  6014.         MenuItemPropToken myItemProp;
  6015.             
  6016.         value->dataHandle     = nil;
  6017.         itemDesc.dataHandle   = nil;
  6018.         propDesc.dataHandle   = nil;
  6019.         
  6020.         if ((wantClass != cProperty) ||
  6021.               (form != formPropertyID))
  6022.             {
  6023.                 return(errAEWrongDataType);
  6024.             }
  6025.         
  6026.         /* get the menu token - it's the container */
  6027.         
  6028.         myErr = AECoerceDesc(container, typeMyMenuItem, &itemDesc);
  6029.         GetRawDataFromDescriptor(&itemDesc,
  6030.                                                          (Ptr)&theMenuItemToken,
  6031.                                                          sizeof(theMenuItemToken),
  6032.                                                          &actualSize);
  6033.                 
  6034.         /* get the property - it's in the selection data */
  6035.         
  6036.         myErr = AECoerceDesc(selectionData, typeType, &propDesc);
  6037.         GetRawDataFromDescriptor(&propDesc,
  6038.                                                          (Ptr)&theProperty,
  6039.                                                          sizeof(theProperty),
  6040.                                                          &actualSize);
  6041.         /*
  6042.             Combine the two into single token
  6043.         */
  6044.         myItemProp.theItemToken  = theMenuItemToken;
  6045.         myItemProp.theItemProp   = theProperty;
  6046.         
  6047.         myErr = AECreateDesc(typeMyItemProp,
  6048.                                                  (Ptr)&myItemProp,
  6049.                                                  sizeof(myItemProp),
  6050.                                                  value);
  6051.             
  6052.         if (itemDesc.dataHandle)
  6053.             ignoreErr = AEDisposeDesc(&itemDesc);
  6054.             
  6055.         if (propDesc.dataHandle)
  6056.             ignoreErr = AEDisposeDesc(&propDesc);
  6057.             
  6058.         return(myErr);
  6059. }    /* PropertyFromMenuItemAccessor */
  6060.  
  6061. pascal OSErr ItemNameToItemIndex(const Str255 theName, MenuHandle theMenu, short *theIndex)
  6062.     {
  6063.         short   index;
  6064.         short   maxItems;
  6065.         Str255  menuName;
  6066.         
  6067.         maxItems = CountMItems(theMenu);
  6068.         
  6069.         for (index=1; index<=maxItems; index++)
  6070.             {
  6071.                 GetItem(theMenu, index, menuName);
  6072.                 if (IUEqualString(theName, menuName)==0)
  6073.                     {
  6074.                         *theIndex = index;
  6075.                         return(noErr);
  6076.                     }
  6077.             }
  6078.         return(errAEIllegalIndex);
  6079.     }
  6080.     
  6081. pascal OSErr MenuItemFromMenuAccessor(DescType     wantClass,
  6082.                                                                             const AEDesc *container,
  6083.                                                                             DescType     containerClass,
  6084.                                                                             DescType     form, 
  6085.                                                                             const AEDesc *selectionData,
  6086.                                                                             AEDesc       *value,
  6087.                                                                             long         theRefCon)
  6088.   {
  6089. #pragma unused (theRefCon)
  6090.     
  6091.         OSErr         myErr;
  6092.         OSErr         ignoreErr;
  6093.         MenuItemToken theMenuItemToken;
  6094.         MenuToken     theMenuToken;
  6095.         AEDesc        menuDesc;
  6096.         Size          actualSize;
  6097.         Str255        nameStr;
  6098.         short         maxItems;
  6099.         short         index;
  6100.             
  6101.         value->dataHandle     = nil;
  6102.         menuDesc.dataHandle   = nil;
  6103.         
  6104.         if ((wantClass != cMenuItem) || (containerClass != cMenu) ||
  6105.               ((form != formAbsolutePosition) && (form != formName)))
  6106.             {
  6107.                 return(errAEWrongDataType);
  6108.             }
  6109.         
  6110.         /* get the menu token - it's the container */
  6111.         
  6112.         myErr = AECoerceDesc(container, typeMyMenu, &menuDesc);
  6113.         GetRawDataFromDescriptor(&menuDesc,
  6114.                                                          (Ptr)&theMenuToken,
  6115.                                                          sizeof(theMenuToken),
  6116.                                                          &actualSize);
  6117.                 
  6118.         if (form==formAbsolutePosition)
  6119.             {
  6120.                 myErr = GetIntegerFromDescriptor(selectionData, &index);
  6121.                 maxItems = CountMItems(theMenuToken.theTokenMenu);
  6122.                 
  6123.                 if (index<0)
  6124.                     index = maxItems + index + 1;
  6125.                     
  6126.                 if ((index<1) || (index>maxItems))
  6127.                   myErr = errAEIllegalIndex;
  6128.             }
  6129.             
  6130.         if (form == formName)
  6131.             {
  6132.                 myErr  = GetPStringFromDescriptor(selectionData, (char *)nameStr);
  6133.                 myErr  = ItemNameToItemIndex(nameStr, theMenuToken.theTokenMenu, &index);
  6134.             }
  6135.         
  6136.         /*
  6137.             Combine the two into single token
  6138.         */
  6139.     
  6140.         theMenuItemToken.theMenuToken  = theMenuToken;
  6141.         theMenuItemToken.theTokenItem  = index;
  6142.         
  6143.         if (myErr==noErr)
  6144.             myErr = AECreateDesc(typeMyMenuItem,
  6145.                                                      (Ptr)&theMenuItemToken,
  6146.                                                      sizeof(theMenuItemToken),
  6147.                                                      value);
  6148.             
  6149.         if (menuDesc.dataHandle)
  6150.             ignoreErr = AEDisposeDesc(&menuDesc);
  6151.             
  6152.         return(myErr);
  6153. }    /* MenuItemFromMenuAccessor */
  6154.  
  6155. /*******************************************************************************/
  6156. /*
  6157.     Stuff for counting objects
  6158. */
  6159.  
  6160. pascal OSErr MyCountProc(DescType     desiredType,
  6161.                                                DescType     containerClass,
  6162.                                                const AEDesc *container,
  6163.                                                long         *result)
  6164.                                             
  6165. /* so far all I count is:
  6166.   (1) the number of active windows in the app;
  6167.   (2) the number of words in a window 
  6168. */
  6169.  
  6170.     {   
  6171.         OSErr       myErr;
  6172.         OSErr       ignoreErr;
  6173.         WindowToken theWindowToken;
  6174.         DPtr        theDocument;
  6175.         TEHandle    theHTE;
  6176.         AEDesc      newDesc;
  6177.         short       wordStart;
  6178.         short       wordLength;
  6179.         Size        tokenSize;
  6180.         TextToken   theTextToken;
  6181.             
  6182.         *result = -1;    /* easily recognized illegal value */
  6183.             
  6184.         myErr = errAEWrongDataType;
  6185.         
  6186.         if (desiredType == cWindow)
  6187.             {
  6188.                 if ((containerClass == typeNull) ||
  6189.                       (containerClass == cApplication))
  6190.                     {
  6191.                         *result = CountWindows();
  6192.                         myErr = noErr;
  6193.                     }
  6194.             }
  6195.         else if ((desiredType == cWord) ||
  6196.               (desiredType == cLine) ||
  6197.               (desiredType == cChar))
  6198.             {
  6199.                 myErr = AECoerceDesc(container, typeMyWndw, &newDesc);
  6200.                 if (newDesc.descriptorType!=typeNull)
  6201.                     {
  6202.                         GetRawDataFromDescriptor(&newDesc,
  6203.                                                                          (Ptr)&theWindowToken,
  6204.                                                                          sizeof(theWindowToken),
  6205.                                                                          &tokenSize);
  6206.                                                                          
  6207.                         ignoreErr = AEDisposeDesc(&newDesc);
  6208.                                                                          
  6209.                         if (theWindowToken==nil)
  6210.                             myErr = errAEIllegalIndex;
  6211.                         else
  6212.                             {
  6213.                         
  6214.                                 theDocument = DPtrFromWindowPtr(theWindowToken);
  6215.                                 theHTE      = theDocument->theText;
  6216.                                 
  6217.                                 if (desiredType == cWord)
  6218.                                     {
  6219.                                         wordStart   = 0;
  6220.                                         wordLength  = (**theHTE).teLength;
  6221.                                         *result     = CountWords(theHTE, wordStart, wordLength);
  6222.                                     }
  6223.                                 
  6224.                                 if (desiredType == cChar)
  6225.                                     *result = (**theHTE).teLength;
  6226.                                     
  6227.                                 if (desiredType == cLine)
  6228.                                     *result = CountLines(theHTE);
  6229.                                     
  6230.                             }
  6231.                     }
  6232.                     
  6233.                 myErr = AECoerceDesc(container, typeMyText, &newDesc);
  6234.                 if (newDesc.descriptorType!=typeNull)
  6235.                     {
  6236.                         GetRawDataFromDescriptor(    &newDesc,
  6237.                                                                             (Ptr)&theTextToken,
  6238.                                                                             sizeof(theTextToken),
  6239.                                                                             &tokenSize);
  6240.                                                                          
  6241.                         ignoreErr = AEDisposeDesc(&newDesc);
  6242.                                                                          
  6243.                         theDocument = DPtrFromWindowPtr(theTextToken.tokenWindow);
  6244.                         theHTE      = theDocument->theText;
  6245.                         
  6246.                         if (desiredType == cWord)
  6247.                             {
  6248.                                 wordStart   = theTextToken.tokenOffset-1;
  6249.                                 wordLength  = theTextToken.tokenLength;
  6250.                                 *result     = CountWords(theHTE, wordStart, wordLength);
  6251.                             }
  6252.                         
  6253.                         if (desiredType == cChar)
  6254.                             *result = theTextToken.tokenLength;
  6255.                             
  6256.                         if (desiredType == cLine)
  6257.                             *result= LineOfOffset(theHTE,theTextToken.tokenOffset-1) - 
  6258.                                              LineOfOffset(theHTE,theTextToken.tokenOffset+theTextToken.tokenLength-1)
  6259.                                              +1;                        
  6260.                     }
  6261.                     
  6262.             }
  6263.             
  6264.         return(myErr);
  6265.     }    /* MyCountProc */
  6266.  
  6267. /*******************************************************************************/
  6268. /*
  6269.     Coercion Handlers - Allow AEResolve to do the hard work
  6270. */
  6271. pascal OSErr CoerceObjToAnything(const AEDesc *theAEDesc,
  6272.                                                              DescType     toType,
  6273.                                                          long         handlerRefCon,
  6274.                                                              AEDesc       *result)
  6275. /*
  6276.     CoerceObjToAnything functions by using AEResolve to do the hard
  6277.     work.
  6278. */
  6279.     {
  6280. #pragma unused (handlerRefCon)
  6281.     
  6282.         OSErr  myErr;
  6283.         OSErr  ignoreErr;
  6284.         
  6285.         AEDesc objDesc;
  6286.             
  6287.         myErr = errAECoercionFail;
  6288.         
  6289.         result->dataHandle = nil;
  6290.         objDesc.dataHandle = nil;
  6291.         
  6292.         
  6293.         if (theAEDesc->descriptorType != typeObjectSpecifier)
  6294.             {
  6295.                 return(errAEWrongDataType);
  6296.             }
  6297.         
  6298.         /* resolve the object specifier */
  6299.         myErr = AEResolve(theAEDesc, kAEIDoMinimum, &objDesc);
  6300.             
  6301.         /* hopefully it's the right type by now, but we'll give it a nudge */
  6302.         if (myErr==noErr)
  6303.             {
  6304.                 myErr = AECoerceDesc(&objDesc, toType, result);
  6305.                 ignoreErr = AEDisposeDesc(&objDesc);
  6306.             }
  6307.             
  6308.         return(myErr);
  6309.     }    /* CoerceObjToAnything */
  6310.  
  6311. /*******************************************************************************/
  6312.  
  6313. /*----------------------------------------------------------------------------------------------*/
  6314.  
  6315. /*now for the edition manager event handling code*/
  6316.  
  6317. pascal OSErr GetHandleFromEvent(const AppleEvent *theAppleEvent, SectionHandle *sectionH)
  6318.     
  6319.     {
  6320.         DescType ignoreType;
  6321.         Size          ignoreSize;
  6322.     
  6323.         return(AEGetKeyPtr(theAppleEvent, keyDirectObject, typeSectionH,
  6324.                                              &ignoreType, (Ptr)sectionH, sizeof(SectionHandle), &ignoreSize));
  6325.     } /* GetHandleFromEvent */
  6326.  
  6327. /*----------------------------------------------------------------------------------------------*/
  6328. pascal OSErr DoReadSection(const AppleEvent *theAppleEvent,AppleEvent *reply,long refCon)
  6329.     
  6330.     {
  6331. #pragma unused (reply, refCon)
  6332.     
  6333.         OSErr         err;
  6334.         SectionHandle sectionH;
  6335.     
  6336.         err = GetHandleFromEvent(theAppleEvent, §ionH);
  6337.         if (IsRegisteredSection(sectionH)==noErr)
  6338.             ReadAnEdition(sectionH);
  6339.         return(err);
  6340.     } /* DoReadSection */
  6341.     
  6342. /*----------------------------------------------------------------------------------------------*/
  6343. pascal OSErr DoWriteSection(const AppleEvent *theAppleEvent, AppleEvent *reply, long refCon)
  6344.     
  6345.     {
  6346. #pragma unused (reply, refCon)
  6347.  
  6348.         OSErr         err;
  6349.         SectionHandle sectionH;
  6350.     
  6351.         err = GetHandleFromEvent(theAppleEvent, §ionH);
  6352.         if (IsRegisteredSection(sectionH) == noErr)
  6353.             WriteAnEdition(sectionH);
  6354.         
  6355.         return(err);
  6356.     } /* DoWriteSection */
  6357.  
  6358. /*----------------------------------------------------------------------------------------------*/
  6359. pascal OSErr DoScrollSection(const AppleEvent *theAppleEvent, AppleEvent *reply, long refCon)
  6360.     {
  6361. #pragma unused (reply, refCon)
  6362.     
  6363.         OSErr         err;
  6364.         SectionHandle sectionH;
  6365.         SectHandle    aSectHandle;
  6366.     
  6367.         err = GetHandleFromEvent(theAppleEvent, §ionH);
  6368.         /*get at the sectHandle*/
  6369.         aSectHandle = (SectHandle)GetERefCon(sectionH);
  6370.         TESetSelect((**aSectHandle).fStart, (**aSectHandle).fEnd, ((**aSectHandle).fDocument)->theText);
  6371.         ShowSelect((**aSectHandle).fDocument);
  6372.         return(err);
  6373.     }
  6374.  
  6375. /*----------------------------------------------------------------------------------------------*/
  6376. pascal OSErr DoCancelSection(const AppleEvent *theAppleEvent, AppleEvent *reply, long refCon)
  6377.  
  6378.     {
  6379. #pragma unused (reply, refCon)
  6380.     
  6381.         OSErr         err;
  6382.         SectionHandle sectionH;
  6383.         SectHandle    aSectHandle;
  6384.             
  6385.         err = GetHandleFromEvent(theAppleEvent, §ionH);
  6386.         aSectHandle = (SectHandle)GetERefCon(sectionH);
  6387.         err = UnRegisterSection(sectionH);
  6388.         DeleteASection(aSectHandle, (**aSectHandle).fDocument);
  6389.         return(noErr);
  6390.     } /* DoCancelSection */
  6391.     
  6392. /* -----------------------------------------------------------------------
  6393.         Name:             InitAppleEvents
  6394.         Purpose:        Initialise the AppleEvent despatch table
  6395.      -----------------------------------------------------------------------**/
  6396.  
  6397. #pragma segment Main
  6398.  
  6399. #define noRefCon -1
  6400.  
  6401. pascal void InitAppleEvents(void)
  6402.     {
  6403.          OSErr aevtErr;
  6404.         
  6405.         gBigBrother    = 0;
  6406.         gCharsInBuffer = 0;
  6407.         gTypingBuffer  = (char *)NewPtr(32000);
  6408.         gTypingTargetObject.dataHandle = 0;
  6409.         
  6410.         /*set up the despatch table for the four standard apple events*/
  6411.         
  6412.         aevtErr = AEInstallEventHandler( kCoreEventClass, kAEOpenApplication, (EventHandlerProcPtr)DoOpenApp, noRefCon, false) ;
  6413.         aevtErr = AEInstallEventHandler( kCoreEventClass, kAEOpenDocuments,   (EventHandlerProcPtr)DoOpenDocument, noRefCon, false) ;
  6414.         aevtErr = AEInstallEventHandler( kCoreEventClass, kAEPrintDocuments,  (EventHandlerProcPtr)DoPrintDocuments, noRefCon, false) ;
  6415.         aevtErr = AEInstallEventHandler( kCoreEventClass, kAEQuitApplication, (EventHandlerProcPtr)MyQuit, noRefCon, false) ;
  6416.         
  6417.         /* set up the despatch table for the core AppleEvents for text */
  6418.         
  6419.         aevtErr = AEInstallEventHandler( kAECoreSuite,     kAEDelete, (EventHandlerProcPtr)DoDeleteEdit,noRefCon, false);
  6420.  
  6421.         aevtErr = AEInstallEventHandler( kAEMiscStandards, kAECut,    (EventHandlerProcPtr)DoCutEdit,   noRefCon, false);
  6422.         aevtErr = AEInstallEventHandler( kAEMiscStandards, kAECopy,   (EventHandlerProcPtr)DoCopyEdit,  noRefCon, false);
  6423.         aevtErr = AEInstallEventHandler( kAEMiscStandards, kAEPaste,  (EventHandlerProcPtr)DoPasteEdit, noRefCon, false);
  6424.         aevtErr = AEInstallEventHandler( kAECoreSuite,     kAESetData,(EventHandlerProcPtr)DoSetData,   noRefCon, false);
  6425.         aevtErr = AEInstallEventHandler( kAECoreSuite,     kAEGetData,(EventHandlerProcPtr)DoGetData,   noRefCon, false);
  6426.         aevtErr = AEInstallEventHandler( kAECoreSuite,     kAEGetDataSize,(EventHandlerProcPtr)DoGetDataSize,   noRefCon, false);
  6427.         
  6428.         aevtErr = AEInstallEventHandler( kAECoreSuite, kAECountElements,   (EventHandlerProcPtr)HandleNumberOfElements,   noRefCon, false);
  6429.         aevtErr = AEInstallEventHandler( kAECoreSuite, kAECreateElement,   (EventHandlerProcPtr)DoNewElement,   noRefCon, false);
  6430.         aevtErr = AEInstallEventHandler( kAECoreSuite, kAEDoObjectsExist,  (EventHandlerProcPtr)DoIsThereA,   noRefCon, false);
  6431.     
  6432.         aevtErr = AEInstallEventHandler( kAECoreSuite,     kAEMove,   (EventHandlerProcPtr)DoMoveWindow,noRefCon, false);
  6433.         aevtErr = AEInstallEventHandler( kAECoreSuite,     kAEClose,  (EventHandlerProcPtr)DoCloseWindow,noRefCon, false);
  6434.         aevtErr = AEInstallEventHandler( kAECoreSuite,     kAESave,   (EventHandlerProcPtr)DoSaveWindow,noRefCon, false);
  6435.         aevtErr = AEInstallEventHandler( kAEMiscStandards, kAERevert, (EventHandlerProcPtr)DoRevertWindow,noRefCon, false);
  6436.         
  6437.         aevtErr = AEInstallEventHandler( kAEMiscStandards, kAECreatePublisher,    (EventHandlerProcPtr)HandleCreatePub, noRefCon, false);
  6438.         aevtErr = AEInstallEventHandler( kAEMiscStandards, kAEMakeObjectsVisible, (EventHandlerProcPtr)HandleShowSelection,   noRefCon, false);
  6439.         
  6440.         /* Now look for recording notifications */
  6441.         
  6442.         aevtErr = AEInstallEventHandler( kCoreEventClass, kAEStartedRecording, (EventHandlerProcPtr)HandleStartRecording, noRefCon, false);
  6443.         aevtErr = AEInstallEventHandler( kCoreEventClass, kAEStoppedRecording, (EventHandlerProcPtr)HandleStopRecording, noRefCon, false);
  6444.         
  6445.         /* Now Put in the required object accessors */
  6446.         
  6447.         aevtErr = AESetObjectCallbacks(nil,MyCountProc,nil,nil,nil,nil,nil);
  6448.         
  6449.         aevtErr = AEInstallObjectAccessor(cWindow,      typeNull,   WindowFromNullAccessor,  0,false);
  6450.         aevtErr = AEInstallObjectAccessor(cWindow,      typeMyAppl, WindowFromNullAccessor,  0,false);
  6451.                 
  6452.         aevtErr = AEInstallObjectAccessor(cApplication, typeNull,   ApplicationFromNullAccessor,  0,false);
  6453.         aevtErr = AEInstallObjectAccessor(cProperty,    typeMyAppl, PropertyFromApplAccessor,0,false);
  6454.         
  6455.         aevtErr = AEInstallObjectAccessor(cChar,             typeMyWndw,TextElemFromWndwAccessor,0,false);
  6456.         aevtErr = AEInstallObjectAccessor(cSpot,             typeMyWndw,TextElemFromWndwAccessor,0,false);
  6457.         aevtErr = AEInstallObjectAccessor(cWord,             typeMyWndw,TextElemFromWndwAccessor,0,false);
  6458.         aevtErr = AEInstallObjectAccessor(cLine,             typeMyWndw,TextElemFromWndwAccessor,0,false);
  6459.         aevtErr = AEInstallObjectAccessor(cProperty,   typeMyWndw,PropertyFromWndwAccessor,0,false);
  6460.     
  6461.         aevtErr = AEInstallObjectAccessor(cProperty,     typeMyText,PropertyFromTextAccessor,0,false);
  6462.         aevtErr = AEInstallObjectAccessor(cChar,           typeMyText,TextElemFromTextAccessor,0,false);
  6463.         aevtErr = AEInstallObjectAccessor(cWord,           typeMyText,TextElemFromTextAccessor,0,false);
  6464.         aevtErr = AEInstallObjectAccessor(cSpot,           typeMyText,TextElemFromTextAccessor,0,false);
  6465.         aevtErr = AEInstallObjectAccessor(cLine,           typeMyText,TextElemFromTextAccessor,0,false);
  6466.         
  6467.         aevtErr = AEInstallObjectAccessor(cMenu,           typeNull,       MenuFromNullAccessor,    0,false);
  6468.         aevtErr = AEInstallObjectAccessor(cProperty,   typeMyMenu,     PropertyFromMenuAccessor,0,false);
  6469.         aevtErr = AEInstallObjectAccessor(cProperty,   typeMyMenuItem, PropertyFromMenuItemAccessor,0,false);
  6470.         aevtErr = AEInstallObjectAccessor(cMenuItem,   typeMyMenu,     MenuItemFromMenuAccessor,0,false);
  6471.         /* Now the coercion handlers */
  6472.  
  6473.       aevtErr = AEInstallCoercionHandler(typeObjectSpecifier,typeMyAppl,      (ProcPtr)CoerceObjToAnything,0,true,false);
  6474.         aevtErr = AEInstallCoercionHandler(typeObjectSpecifier,typeMyWndw,      (ProcPtr)CoerceObjToAnything,0,true,false);
  6475.       aevtErr = AEInstallCoercionHandler(typeObjectSpecifier,typeMyText,      (ProcPtr)CoerceObjToAnything,0,true,false);
  6476.       aevtErr = AEInstallCoercionHandler(typeObjectSpecifier,typeMyTextProp,  (ProcPtr)CoerceObjToAnything,0,true,false);
  6477.       aevtErr = AEInstallCoercionHandler(typeObjectSpecifier,typeMyWindowProp,(ProcPtr)CoerceObjToAnything,0,true,false);
  6478.       aevtErr = AEInstallCoercionHandler(typeObjectSpecifier,typeMyApplProp,  (ProcPtr)CoerceObjToAnything,0,true,false);
  6479.       aevtErr = AEInstallCoercionHandler(typeObjectSpecifier,typeMyMenu,      (ProcPtr)CoerceObjToAnything,0,true,false);
  6480.       aevtErr = AEInstallCoercionHandler(typeObjectSpecifier,typeMyMenuProp,  (ProcPtr)CoerceObjToAnything,0,true,false);
  6481.       aevtErr = AEInstallCoercionHandler(typeObjectSpecifier,typeMyMenuItem,  (ProcPtr)CoerceObjToAnything,0,true,false);
  6482.       aevtErr = AEInstallCoercionHandler(typeObjectSpecifier,typeMyItemProp,  (ProcPtr)CoerceObjToAnything,0,true,false);
  6483.         
  6484.         /*now install the appropriate edition manager events*/
  6485.         
  6486.         aevtErr = AEInstallEventHandler( sectionEventMsgClass, sectionReadMsgID,   (EventHandlerProcPtr)DoReadSection, noRefCon, false) ;
  6487.         aevtErr = AEInstallEventHandler( sectionEventMsgClass, sectionWriteMsgID,  (EventHandlerProcPtr)DoWriteSection, noRefCon, false) ;
  6488.         aevtErr = AEInstallEventHandler( sectionEventMsgClass, sectionScrollMsgID, (EventHandlerProcPtr)DoScrollSection, noRefCon, false) ;
  6489.         aevtErr = AEInstallEventHandler( sectionEventMsgClass, sectionCancelMsgID, (EventHandlerProcPtr)DoCancelSection, noRefCon, false) ;
  6490.         
  6491.  } /* InitAppleEvents */
  6492.